下笔春蚕食叶声。

字符串哈希

参考 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' + 1)%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;
}
posted @ 2020-11-06 07:40  ACwisher  阅读(104)  评论(1编辑  收藏  举报