1. 程式人生 > 其它 >Oulipo(雜湊表與字串雜湊)

Oulipo(雜湊表與字串雜湊)

技術標籤:字首和hash雜湊表c++

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