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;
}
给你两个字符串,要求你找到两个字符串的最长子串的长度。
解决方法:
我用的是字符串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;
}
相关文章推荐
- (Relax 后缀数组1.4)POJ 2774 Long Long Message(求两个字符串公共子串的最大长度)
- [POJ 2774] Long Long Message (字符串哈希+二分)
- POJ 2774 Long Long Message(2.3 求两个字符串的最长公共子串)
- 【后缀数组】 POJ 2774 Long Long Message 两个字符串的最长公共子串长度
- POJ 2774 Long Long Message(后缀数组 两个字符串的最长公共字串 )
- POJ 2774 Long Long Message (最长公共子串)
- POJ 2774 Long Long Message 题解&代码
- POJ-2774-Long Long Message(后缀数组-最长公共子串)
- poj 2774 Long Long Message(后缀数组)
- POJ - 2774 Long Long Message (最长公共子串 后缀数组)
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
- POJ 2774 Long Long Message(后缀数组:公共子串)
- PKU 2774 Long Long Message (后缀数组练习模板题)
- POJ 2774 Long Long Message 求两个串最长公共子串(后缀数组)
- poj 2774 Long Long Message
- PKU 2774 Long Long Message (后缀数组练习模板题)
- POJ 2774 Long Long Message(SA 求最长公共子串)
- ●POJ 2774 Long Long Message
- poj 2774 Long Long Message
- POJ 2774 Long Long Message(后缀数组[最长公共子串])