Description
Input
Output
Sample Input
3 2 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 3 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA 3 CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
Sample Output
no significant commonalities AGATACCATCATCAT
这题就是用暴力枚举,初看很难用枚举实现,其实复杂度不大的。
#include<stdio.h> #include<string.h> char s[13][70],s1[70],s2[70],ss[70]; int len[20],next[70],len1,len2; void nextt() { int i,j; i=0;j=-1; memset(next,-1,sizeof(next)); while(i<len2){ if(j==-1 || s2[i]==s2[j]){ i++;j++;next[i]=j; } else j=next[j]; } } int kmp() { int i,j; i=0;j=0; while(i<len1 && j<len2){ if(j==-1 || s1[i]==s2[j]){ i++;j++; } else j=next[j]; } if(j>=len2)return 1; else return 0; } int main() { int n,m,i,j,T,cunzai,flag; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%s",s[i]); len[i]=strlen(s[i]); } cunzai=0; for(len2=60;len2>=3;len2--){ memset(s2,0,sizeof(s2)); for(j=0;j<=60-len2;j++){ //枚举起点 for(i=0;i<=len2-1;i++){ s2[i]=s[1][j+i]; } nextt(); flag=1; for(i=2;i<=n;i++){ len1=len[i]; strcpy(s1,s[i]); if(!kmp()){ flag=0;break; } } if(flag==1){ if(cunzai==0){ cunzai=1;strcpy(ss,s2); } else{ if(strcmp(ss,s2)>0)strcpy(ss,s2); } } } if(cunzai)break; } if(cunzai)printf("%s\n",ss); else printf("no significant commonalities\n"); } return 0; }