BKDR hash
将字符串看成是P进制数字,P的选取是131 或13331冲突率较低
用unsigned long long 来进行隐式用 2 64 − 1 2^{64}-1 264−1来取模
const int n,P=13331;
vector<unsigned long long> h(n,0); //储存前i个字符串的哈希值
vector<unsigned long long> p(n,0); //储存P的i次方
void BKDR_hash(string s) //初始化
{
p[0]=1;
h[0]=s[0]; //初始化
for(int i=1;i<n;i++)
{
p[i]=p[i-1]*P; //次方
h[i]=h[i-1]*P+s[i]; //hash值
}
}
unsigned long long get_hash(int left,int right)
{
return left?h[right]-h[left-1]*p[right-left+1]:h[right]; //获取区间内字符串的哈希值
}