水题,枚举第一个字符串的所有子串,然后去和其他的串匹配,其它地方没什么好多说的,有些细节的地方没注意搞得我wa了好几次。郁闷 要注意输出的是字典序小的,这代码写得太丑了 /* * File: main.cpp * Author: Mi * * Created on 2011年3月27日, 下午7:02 */ #include <cstdlib> #include <stdio.h> #include <string.h> using namespace std; /* * */ char str[11][65]; int P[70]; void next(char *B,int m,int *P) { int i,j=0; P[1]=0; for(i=2;i<=m;i++) { while(j>0&&B[j+1]!=B[i]) j=P[j]; if(B[j+1]==B[i]) j++; P[i]=j; } } int kmp(char *A,char *B,int n,int m,int *P) { int i,j=0; for(i=1;i<=n;i++) { while(j>0&&B[j+1]!=A[i]) j=P[j]; if(B[j+1]==A[i]) j++; if(j==m) return i-j; } return -1; } int main(int argc, char** argv) { int t,h,f,l; char temp[70],ans[70]; scanf("%d",&t); while(t--) { int n,tl=0; memset(ans,0xfff,sizeof(ans)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%s",str[i]+1); l=strlen(str[1]+1); for(int i=1;i<=l;i++) { for(int j=i+3;j<=l+1;j++) { strncpy(temp+1,str[1]+i,j-i+1); temp[j-i+1]='/0'; h=strlen(temp+1); next(temp,h,P); // puts(temp+1); f=0; for(int k=2;k<=n;k++) if(kmp(str[k],temp,l,h,P)!=-1) f++; if(f==n-1) { if(h>tl) { tl=h; strcpy(ans,temp+1); } else if(h==tl) { if(strcmp(temp+1,ans)<0) strcpy(ans,temp+1); } } } } if(tl<3) puts("no significant commonalities"); else puts(ans); } return 0; }