描述
输入2个字符串str1,str2(都是小写字母),求str1在str2中出现了多少次。
样例输入 1
abba abbabbacd
样例输出 1
2
#include<bits/stdc++.h>
using namespace std;
char s1[1000005],s2[1000005];
unsigned long long h[1000005],h1;
int base=131;
int main(){
cin>>s1>>s2;
//求s1的hash值
int len1=strlen(s1);
for(int i=0;i<len1;i++){
h1=h1*base+s1[i];
}
//计算并保留s2每个长度对应的hash值
int len2=strlen(s2);
for(int i=0;i<len2;i++){
h[i+1]=h[i]*base+s2[i];
}
int ans=0;
unsigned long long k=pow(base,len1);
for(int i=0;i+len1<=len2;i++){ //枚举子串的起点下标
if(h1==h[i+len1]-h[i]*k){
ans++;
}
}
cout<<ans;
return 0;
}