您的位置:首页 > 其它

2774 -- Long Long Message(字符串hash)

2014-08-20 18:53 253 查看
题目大意:

     给你两个字符串,要求你找到两个字符串的最长子串的长度。

解决方法:

   我用的是字符串hash(hash大法好啊),首先二分子串的长度。先将短的字符串长度为n的子串都hash了,然后再将长串hash了,看有没有相同的。(注意细节)

我的代码:

#include <cstdio>
#include <string>
#include <iostream>
#include <cstring>
#include <algorithm>
#define maxn 100100
#define seed 131
#define ull unsigned long long
using namespace std;
char s1[maxn],s2[maxn],s3[maxn];
ull base[maxn],as[maxn];
int n,m;
int yes(int len){
ull ua,ub;ua=0;ub=0;
for (int i=0;i<len;i++)
ua=ua*seed+s1[i];
as[0]=ua;
for (int i=0;i+len-1<n;i++)
as[i+1]=as[i]*seed+s1[i+len]-s1[i]*base[len];
sort(as,as+n-len+1);
for (int i=0;i<len;i++)
ub=ub*seed+s2[i];
int kkk=m-len+1;
for (int i=0;i<kkk;i++){
if (binary_search(as,as+n-len+1,ub)) return 1;
ub=ub*seed+s2[i+len]-s2[i]*base[len];
}
return 0;
}
int main (){
//freopen("test.in","r",stdin);
base[0]=1;
for (int i=1;i<maxn;i++)
base[i]=base[i-1]*seed;
while (~scanf("%s%s",s1,s2)){
int ans;
n=strlen(s1);m=strlen(s2);
if (n>m){
swap(n,m);
strcpy(s3,s1);
strcpy(s1,s2);
strcpy(s2,s3);
}
int l,r;l=0;r=n;
while (l<r){
int mid=(l+r)/2;
if (yes(mid)) l=mid;
else r=mid-1;
if (l+1==r){
if (yes(r)) l=r;
else r=l;
}
ans=l;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: