C++【模板】字串雜湊
阿新 • • 發佈:2018-11-01
介紹:關於字串hash,一句話概括,就是把字串有效的轉化為一個整數
hash[i]=(hash[i-1]*p+idx(s[i]))%mod
for example:取p=13, mod=101,求abc對應的整數
hash[0]=1; 表示a對映1。
hash[1]=(hash[0]*13+idx(b))%101=15;表示ab對映15。
hash[2]=(hash[1]*13+idx(c))%101=97; 表示abc對映97。
同樣的方法。我們可以將以下字串進行對映:
abc ->97
bbc ->64
aba ->95
aadaabac ->35
這樣,我們就可以記錄下每一個字串所對應的整數,若下一次出現一個字串,查詢整數是否出現過,就可以完成驗證。
但是也有可能出現兩個字串對應一個整數。
調整方法:
調整p和mod,取p和mod都為較大的素數。 p取6~8位素數,mod一般取1e9+7或者1e9+9;
某種程度上,hash=亂搞,只要把他弄的越亂就越好,使得衝突概率最低。
常用的幾種字串hash方法:
多重hash的話,就是你用不同的兩種或多種方式雜湊,然後分別比對每一種雜湊值是否相同——顯然是增加了空間和時間,但也確實增加了其正確性。
#include<iostream> using namespace std; #include<string.h> #include<string> typedef unsigned long long ull; int n,length; #include<algorithm> string a; ull mod=1e9+7; ull h[100010]; ull prime=233317; ull hashw(string a) { length =a.size(); ull temp=((ull)a[0])%mod; for(int i=1;i<length;i++) { temp=(temp*prime+(ull)a[i])%mod; } return temp; } int main() { cin>>n; int ans=1; for(int i=0;i<n;i++) { cin>>a; h[i]=hashw(a); } sort(h,h+n); for(int i=0;i<n-1;i++) { if(h[i]!=h[i+1])ans++; } cout<<ans<<endl; return 0; }