题目连接:点击查看
题意:n个字符串最长公共子串,相同长度就找字典序小的,poj那个是长度小于3,输出那句话
题解:以某一字符串为基准,枚举每个子串,然后暴力kmp即可,特记!!!不符合就break,否则会T掉
HDU:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char s[4100][210],str[210],ans[210];
int nex[210],len,n,anslen,l;
void getnex()
{
int i=0,j=-1;
nex[0]=-1;
while(i<len)
{
if(j==-1||str[i]==str[j]) nex[++i]=++j;
else j=nex[j];
}
}
int kmp(int p)
{
int i=0,j=0;
while(i<l&&j<len)
{
if(j==-1||s[p][i]==str[j])i++,j++;
else j=nex[j];
if(j==len) break;
}
// cout<<j<<endl;
return j>=len;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
scanf("%s",s[i]);
anslen=-1;
l=strlen(s[1]);
for(int i=0;i<l;i++)
{
for(int j=i;j<l;j++)
{
int k;
for(k=i;k<=j;k++) str[k-i]=s[1][k];
str[j-i+1]='\0';
len=j-i+1;
int flag=0;
getnex();
// cout<<str<<endl;
for(k=1;k<=n;k++)
{
if(kmp(k)) flag++;
else break;
}
// cout<<flag<<endl;
if(flag==n&&(len>anslen || len==anslen&&strcmp(str,ans)<0))
{
anslen=len;
for(k=0;k<len;k++)
ans[k]=str[k];
ans[len]='\0';
}
}
}
if(anslen==-1) printf("IDENTITY LOST\n");
else printf("%s\n",ans);
}
return 0;
}
POJ:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char s[4100][210],str[210],ans[210];
int nex[210],len,n,anslen,l;
void getnex()
{
int i=0,j=-1;
nex[0]=-1;
while(i<len)
{
if(j==-1||str[i]==str[j]) nex[++i]=++j;
else j=nex[j];
}
}
int kmp(int p)
{
int i=0,j=0;
while(i<l&&j<len)
{
if(j==-1||s[p][i]==str[j])i++,j++;
else j=nex[j];
if(j==len) break;
}
// cout<<j<<endl;
return j>=len;
}
int main()
{
int T;
cin>>T;
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",s[i]);
anslen=-1;
l=strlen(s[1]);
for(int i=0;i<l;i++)
{
for(int j=i;j<l;j++)
{
int k;
for(k=i;k<=j;k++) str[k-i]=s[1][k];
str[j-i+1]='\0';
len=j-i+1;
int flag=0;
getnex();
// cout<<str<<endl;
for(k=1;k<=n;k++)
{
if(kmp(k)) flag++;
else break;
}
// cout<<flag<<endl;
if(flag==n&&(len>anslen || len==anslen&&strcmp(str,ans)<0))
{
anslen=len;
for(k=0;k<len;k++)
ans[k]=str[k];
ans[len]='\0';
}
}
}
if(anslen<3) printf("no significant commonalities\n");
else printf("%s\n",ans);
}
return 0;
}