题目描述:给你一个只包含小写字母的字符串,每个字母有好坏之分 在第二行输入,现在让你选出有多少子串是好串;
分析: 既然是要用hash,那么用朴素的方法是各种T  这里借用分析下字符串hash
            对每个字母看成是某进制转换过来的数,那么这个串所对应的十进制数就应该是唯一的,由于模数的存在可能导致某些位无效 如二进制 11010(26)  和10010(18)模8 结果都是2  因为第二位取不取都行,不做贡献;
            这就导致了冲突,所以进制尽量取素数(主要还是为了避免模),模的话尽量取大点,这样分布的广,
            这里的模是 unsigned long long (代码里里的是进制数)
ac代码:
#include<bits/stdc++.h>
using namespace std;
const long long mod=1313131313131313131;
int main(){
// freopen("1.txt","r",stdin);
//    cout<<mod<<endl;
    string s,ss;
    int k;
    cin>>s>>ss>>k;
    int sum[2000];
    memset(sum,0,sizeof sum);
    int len=s.length();
    for(int i=0;i<len;i++){
        sum[i+1]=sum[i]+(ss[s[i]-'a']=='0'?1:0);
    }
    set<unsigned long long >set11;
    int ans=0;
    for(int i=1;i<=len;i++){
        unsigned long long temp=0;
        for(int j=i;j<=len;j++){
            if(sum[j]-sum[i-1]<=k){
                temp=temp*mod+s[j-1];
                if(set11.count(temp)==0){ans++;set11.insert(temp);}
            }
            else break;
        }
    }
    cout<<ans<<endl;
}