题目描述:给你一个只包含小写字母的字符串,每个字母有好坏之分 在第二行输入,现在让你选出有多少子串是好串;
分析: 既然是要用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;
} 
京公网安备 11010502036488号