这道题我就不解释了,无非就是枚举取字串,然后kmp进行比较。
本来不大想贴着道题的。但是我很悲剧的是为了省事直接在上一道KMP上贴的代码,然后用了一个memset函数,我的pre数组开刀了一百万= =。
不过还是比较值得的,花了时间不少但是还是知道了memset是需要花费时间的。
View Code
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int pre[100]; void predeal(char s[]) { int len,i,j; len = strlen(s); pre[0] = -1; j = -1; for(i = 1;i < len;i++) { while(j > -1 && s[j+1] != s[i]) j = pre[j]; if(s[j+1] == s[i]) j++; pre[i] = j; } } int kmp(char s1[],char s2[]) { predeal(s1); int len1,len2,i,j,num; len1 = strlen(s1); len2 = strlen(s2); num = 0; for(i = 0,j = -1;i < len2;i++) { while(j > -1 && s1[j+1] != s2[i]) j = pre[j]; if(s1[j+1] == s2[i]) j++; if(j == len1-1) return 1; } return 0; } int main() { int n,i,j,t,k,leap; char s[65][65],sub[65],ans[65],str[65]; int Case = 0; // freopen("out.txt","r",stdin); scanf("%d",&t); while(t--) { leap = 0; scanf("%d%*c",&n); for(i = 0;i < n;i++) gets(s[i]); int len = strlen(s[0]); memset(ans,0,sizeof(ans)); for(i = 3;i <= len;i++) { for(j = 0;j <= len-i;j++) { for(k = 0;k < i;k++) sub[k] = s[0][j+k]; sub[k] = '\0'; memset(pre,0,sizeof(pre)); for(k = 1;k < n;k++) { if(kmp(sub,s[k]) == 0) break; } if(k == n) { if(ans[0] == '\0') strcpy(ans,sub),leap = 1; if(strlen(sub) > strlen(ans)) strcpy(ans,sub),leap =1; if(i == strlen(ans)&& strcmp(ans,sub) > 0) strcpy(ans,sub),leap = 1; } } } if(leap) printf("%s\n",ans); else printf("no significant commonalities\n"); } return 0; }