Oulipo(哈希表与字符串哈希)

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_52536621/article/details/113805875