#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ull unsigned long long
const ull B=100000007;
const int maxn=100000+100,mod=100003;
char a[maxn],b[maxn],tmp[maxn];
int alen,blen;
int e,begin[maxn],next[maxn*2];
ull to[maxn*2];
int solve(int len){
ull t=1,ah=0,bh=0;
int i,j,k,m,n;
e=0;
for(i=0;i<maxn;i++)begin[i]=0;
for(int i=0;i<len;i++)
{
t*=B;
ah=ah*B+a[i];
bh=bh*B+b[i];
}
to[++e]=ah;
next[e]=begin[ah%mod];
begin[ah%mod]=e;
if(ah==bh)return 1;
for(i=0;i+len<alen;i++){
ah=ah*B+a[i+len]-a[i]*t;
to[++e]=ah;
next[e]=begin[ah%mod];
begin[ah%mod]=e;
}
for(i=0;i+len<blen;i++){
bh=bh*B+b[i+len]-b[i]*t;
ull tx=bh%mod;
for(ull u=begin[tx];u;u=next[u]){
if(to[u]==bh){
return 1;
}
}
}
return 0;
}
int main(){
int i,j,k,m,n;
gets(a);
gets(b);
alen=strlen(a);
blen=strlen(b);
if(alen>blen){
k=alen;alen=blen;blen=k;
strcpy(tmp,a);
strcpy(a,b);
strcpy(b,tmp);
}
int s=0,t=alen,mid;
while(s+1<t){
mid=(s+t)/2;
if(solve(mid))
s=mid;
else
t=mid;
}
if(solve(t))printf("%d\n",t);
else printf("%d\n",s);
return 0;
}
POJ2774 字符串HASH
最新推荐文章于 2019-08-04 23:25:00 发布