#include<stdio.h> #include<string.h> const int N=100; int n,m,next[N]; char dna[N][N]; void get_next(char *str,int len) { next[0]=-1; int j=0,k=-1;//k记录next[]; while(j<len) { if(k==-1||str[j]==str[k]) { k++; j++; if(str[k]!=str[j]) next[j]=k; else next[j]=next[k]; } else k=next[k]; } } int kmp(char *s,int slen) { get_next(s,slen); int f=0,j,k,i; for(i=1;i<m;i++) { int k=0, j=0; int len=strlen(dna[i]); while(j<len&&k<slen) { if(k==-1||s[k]==dna[i][j]) { j++; k++; } else k=next[k]; } if(k<slen)break; } if(i==m)return 1; else return 0; } int main() { int i,j,k,sum,max=-1; char s[63],ans[63]; scanf("%d",&n); while(n--) { max=-1; scanf("%d",&m); getchar(); for(i=0;i<m;i++) { gets(dna[i]); } int len=strlen(dna[0]); for(i=0;i<len;i++) { for(j=i;j<len;j++) { sum=0; for(k=i;k<=j;k++) { s[sum++]=dna[0][k]; } s[sum]='\0'; if(kmp(s,sum)==1) { if(sum>max) { strcpy(ans,s); max=sum; } else { if(max==sum&&strcmp(ans,s)>0) { strcpy(ans,s); } } } } } if(max<3)printf("no significant commonalities\n"); else printf("%s\n",ans); } }