Oulipo
思路:我们要先把b的hash值求出来,然后计算a串的前缀和,接着再把每一段利用前缀和算出来,看看哪个是满足结果的,计数器加一。
注意
1.string类型需要在前面加std::,不然会报错(见下)。
2.如果想让程序较快,可以引用快速幂算法(见下)。
3.cin加速器可以参考一下(见下),std::ios::sync_with_stdio(false);是解绑cin和stdin或cout和stdout,cin.tie(0);和cout.tie(0);解绑两者的绑定。
代码
#include<bits/stdc++.h>
#define x 29999997
std::string a,b;
long long la,lb,num,hash[1000001],s,n,p=1,base=31,i,t;
using namespace std;
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>a>>b;
la=a.size();
lb=b.size();
n=lb;
for(i=0;i<lb;i++)
num=(b[i]+num*31%x)%x;
while(n>0){
if(n%2==1)
p=p*base%x;
n/=2;
base=base*base%x;
}
for(i=1;i<=la;i++){
hash[i]=(hash[i-1]*31%x+a[i-1])%x;
if(i>=lb){
s=((hash[i]-hash[i-lb]*p)%x+x)%x;
if(s==num)
t++;
}
}
cout<<t;
return 0;
}