常用的进制hash满足一些性质所有可以O(1) 查询子串或者减去某些位置的子串的hash值。
scanf("%d", &n);
scanf("%s", a+1);
p[0] = 1, h[0] = 0;
for(int i = 1; i <= n; i++){
h[i] = h[i-1]*base + a[i] - 'A';
p[i] = p[i-1]*base;
}
1.查询子串的hash值
比如ABACD的子串ACD的hash值为h[5]-h[3-1]*p[5-3+1]
inline unsigned long long get_hash(int l, int r)
{
return h[r] - h[l-1] * p[r-l+1];
}
证明:
h a s h ( 1 , r ) = ∑ i = 1 r a [ i ] ∗ b a s e r − i hash(1,r) = \sum_{i=1}^r a[i]*{base^{r-i}} hash(1,