字符串哈希

参考 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;
}
原文地址:https://www.cnblogs.com/zdsrs060330/p/13934944.html