字符串哈希

· · 个人记录

字符串哈希

进制哈希

struct hseds{
    ll v1,v2;
    hseds(){}
    hseds(ll _v1,ll _v2){v1=_v1,v2=_v2;}
    bool operator<(const hseds b) const{return v1!=b.v1?v1<b.v1:v2<b.v2;}
};

hseds strhash(string &sn){
    ll v1n=0,v2n=0,len=sn.size();
    For(i,0,len-1) v1n=(v1n*pow1%mod1+sn[i])%mod1;
    For(i,0,len-1) v2n=(v2n*pow2%mod2+sn[i])%mod2;
    return hseds(v1n,v2n);
}

差分求子串(个人叫法)

hseds subhseds(int l,int r,hseds rs[]){
    hseds ret;
    ret.v1=(rs[r].v1-rs[l-1].v1*p1[r-l+1]%mod1+mod1)%mod1;
    ret.v2=(rs[r].v2-rs[l-1].v2*p2[r-l+1]%mod2+mod2)%mod2;
    return ret;
}