题意:求最长公共子串
参考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);
}
}