参考 https://blog.csdn.net/wxy2635618879/article/details/103968837
作为一个喜爱map的蒟蒻 我突然在CSP前意识到自己根本不会哈希。我对哈希的理解止步于自己yy出的求值。。。
子串哈希 O(1)
(hash=hash_{r}-hash_{l-1}base^{r-l+1})
证明:
(hash(1,r)=sum_{i=1}^r sum a_ibase^{r-i})
(hash(1,l-1)=sum_{i=1}^{l-1} sum a_ibase^{l-1-i})
(hash(l,r)=sum_{i=l}^r sum a_ibase^{r-i})
(hash(l,r)=sum_{i=1}^r sum a_ibase^{r-i}-sum_{i=1}^{l-1} sum a_ibase^{r-i})
(hash(l,r)=hash(1,r)-sum_{i=1}^{l-1} sum a_ibase^{l-1-i}base^{r-l+1})
(hash(l,r)=hash(1,r)-hash(1,l-1)base^{r-l+1})
void pre(){
p[0]=1;f[0]=0;
for(int i=1;i<=n;i++){
f[i]=(1ll*f[i-1]*29+s[i]-'a')%mod;
p[i]=1ll*p[i-1]*29%mod;
}
}
int calc(int l,int r){
return ((f[r]-1ll*f[l-1]*p[r-l+1]%mod)%mod+mod)%mod;
}