Oulipo(雜湊表與字串雜湊)
阿新 • • 發佈:2021-02-15
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;
}