POJ2774(二分+哈希)

来源:互联网 发布:打豆豆小游戏优化版 编辑:程序博客网 时间:2024/06/08 13:44

题意:求最长公共子串

参考http://www.cnblogs.com/Penn000/p/5852483.html

const ULL seed=131;ULL h1[N],h2[N],ts[N];char s1[N],s2[N];ULL a[N];int len1,len2;ULL gethash(ULL *h,int l,int r){    return h[r]-ts[r-l]*h[l];}bool ok(int len){    int cnt=0;    for(int i=len;i<=len1;++i){        a[cnt++]=gethash(h1,i-len,i);    }    sort(a,a+cnt);    for(int i=len;i<=len2;++i){        ULL now=gethash(h2,i-len,i);        if(binary_search(a,a+cnt,now))return true;    }    return false;}int main(){    ts[0]=1;    for(int i=1;i<=N;++i)ts[i]=ts[i-1]*seed;    while(~sf(" %s%s",s1,s2)){        len1=strlen(s1);        len2=strlen(s2);        h1[0]=0;        for(int i=0;i<len1;++i)            h1[i+1]=h1[i]*seed+s1[i];        h2[0]=0;        for(int i=0;i<len2;++i)            h2[i+1]=h2[i]*seed+s2[i];        int l=0,r=max(len1,len2);        while(l<r){            int mid=(l+r)>>1;            if(ok(mid+1))l=mid+1;            else r=mid;        }        pf("%d\n",l);    }}