您的位置:首页 > 其它

poj 3080

2015-12-11 17:46 197 查看
题意就是找多条字符串的最长公共子串

首先比较前两个,然后找出他们的子串,然后子串和下一个比较。如果没有子串了 输入no

没了  一开始卡在一个小错误里 卡了很久 这道题还可以用KMP 暴力 后缀数组  往后贴出。还有个细节就是如果存在多个长度一样的子串,那么输出字典序最小的

贴上代码

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int s,t;
char a[11][65];
char tmp[65];
int lcs(char *a,char *b)
{
// printf("%s\n",b);
int x=strlen(a);
int y=strlen(b);
int l[65][65];
memset(l,0,sizeof(l));
char mp1[65];
memset(mp1,'\0',sizeof(mp1));
int ma=0;
for(int i=0; i<x+1; i++)
l[i][0]=0;
for(int i=0; i<y+1; i++)
l[0][i]=0;
for(int i=1; i<=x; i++)
{

for(int j=1; j<=y; j++)
{
if(a[i-1]==b[j-1])
{
l[i][j]=l[i-1][j-1]+1;
}
else
{
l[i][j]=0;
}
if(l[i][j]>=ma)
{
char t0[65];
memset(t0,'\0',sizeof(t0));
int t1=i;
int t2=j;
int tma=l[i][j];
t1--;
t2--;
t0[tma--]='\0';
while(t1>=0&&t2>=0)
{
if(a[t1]==b[t2])
{
t0[tma--]=a[t1];
t1--;
t2--;
}
else
break;
}
//printf("%d\n",ma);
if(l[i][j]>ma)
{
ma=l[i][j];
strcpy(mp1,t0);
continue;
}
if(l[i][j]==ma)
if(strcmp(mp1,t0)>0)
strcpy(mp1,t0);

}
}
}
memset(tmp,'\0',sizeof(tmp));
strcpy(tmp,mp1);
// printf("%s\n",tmp);
return ma;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
getchar();
for(int i=1; i<=n; i++)
{
gets(a[i]);
}
strcpy(tmp,a[1]);
int flag=1;
for(int i=2; i<=n; i++)
{
int jg=lcs(a[i],tmp);
//printf("%d\n",jg);
if(jg<3)
{
flag=0;
printf("no significant commonalities\n");
break;
}
}
if(flag)
printf("%s\n",tmp);
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: