哈希用于字符串匹配
下面的代码中用unsigned long long 运算的自然溢出来省掉取模的过程。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const unsigned long long ull;
const ull B=100000007;
bool contain(string a,string b){
int al=a.length();int bl=b.length();
if(al>bl)return false;
ull t=1;
for(int i=0;i<al;i++)t*=B;
ull ah=0,bh=0;
for(int i=0;i<al;i++)ah=ah*B+a[i];
for(int i=0;i<al;i++)bh=bh*B+b[i];
for(int i=0;i+al<=bl;i++){
if(ah==bh)return true;
if(i+al<bl)bh=bh*B+b[i+al]-b[i]*t;
}
return false;
}