也是一道水题,但是看到还以为要用到KMP之类的东西,<p>后来发现只要暴力就好了 成就不在于写了多么高超的算法、、 </p><p>这是第一个不借助博客自己看懂的题。。。果然还是太弱了吗。。。 暴力枚举匹配,1A轻松。。 </p><p>虽然手速还是不快,从单步调试到输出调试果然还是很难适应</p>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,maxf,l,r;
char s[21][71];
void check(int x,int y)//判断每一个串是否包含此字串
{
bool flag;
int flag_tot=0;
for (int i=2;i<=n;i++)
for (int j=0;j<60;j++)
{
if (j+y-x>60) break;
flag=true;
for (int k=0;k<=y-x;k++)
if (s[1][x+k]!=s[i][j+k])
{
flag=false;
break;
}
if (flag==true)
{
flag_tot++;
break;
}
}
if (flag_tot==n-1)
{
//printf("%d %d\n------",x,y);
if (y-x+1>maxf)
{
maxf=y-x+1;
l=x,r=y;
return;
}
if (y-x+1==maxf)
{
for (int i=0;i<maxf;i++)
{
if (s[1][x]<s[1][l])
{
l=x;
r=y;
return;
}
if (s[1][x]>s[1][l])
return ;
}
}
}
}
int main()
{
freopen("poj3080.in","r",stdin);
freopen("poj3080.out","w",stdout);
int ci;
scanf("%d",&ci);
while (ci--)
{
memset(s,0,sizeof(s));
maxf=0;
l=0;
r=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%s",s[i]);
//-----------------------------------
for (int i=0;i<60;i++)
for (int j=i;j<60;j++)
check(i,j);
//printf("%d\n",maxf);
if (maxf<3) printf("no significant commonalities\n");
else
{
for (int i=l;i<=r;i++)
printf("%c",s[1][i]);
printf("\n");
}
}
return 0;
}