【模板】哈希

char s1[81],s2[82];
int len1,len2;
LL g[82];
LL f1[82],f2[82];
void pre()
{
    g[0]=1;
    for(int i=1;i<max(len1,len2);i++) g[i]=g[i-1]*26%mod;
    f1[0]=s1[0]-'a';
    for(int i=1;i<len1;i++) f1[i]=(f1[i-1]*26+s1[i]-'a')%mod;
    f2[0]=s2[0]-'a';
    for(int i=1;i<len2;i++) f2[i]=(f2[i-1]*26+s2[i]-'a')%mod;    
}//哈希模板 
LL gethash(LL *f,int l,int r)
{
    if(!l) return f[r];  
    return (f[r]-f[l-1]*g[r-l+1]%mod+mod)%mod;
}//两段比较 
int main()
{
    scanf("%s%s",s1,s2);
    len1=strlen(s1);
    len2=strlen(s2);
    pre();
    for(int i=min(len1,len2);i;i--)
    {
        if(gethash(f1,0,i-1)==gethash(f2,len2-i,len2-1) ) { printf("%d",i); return 0; }
        if(gethash(f2,0,i-1)==gethash(f1,len1-i,len1-1) ) { printf("%d",i); return 0; }
    }
    printf("0");
}

 

posted @ 2019-04-10 19:59  Dorom  阅读(255)  评论(0)    收藏  举报