Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 698 Accepted Submission(s): 281
代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define M 40005 #define N 210 char s[M][N]; int Next[N]; void FindNext(char b[]) { int i=0, j=-1, blen=strlen(b); Next[0] = -1; while(i<blen) { if(j==-1 || b[i]==b[j]) Next[++i] = ++j; else j = Next[j]; } } int KMP(char a[], char b[]) { int i=0, j=0; int alen=strlen(a), blen=strlen(b); FindNext(b); while(i<alen) { while(j==-1 || (a[i]==b[j] && i<alen && j<blen)) i++, j++; if(j==blen) return 1; j = Next[j]; } return 0; } int main() { int n; while(scanf("%d", &n), n) { int i, j, k, MinLen=1000, len; char ss[N]; memset(s, 0, sizeof(s)); for(i=0; i<n; i++) { scanf("%s", s[i]); len = strlen(s[i]); if(len<MinLen) { MinLen = len; memset(ss, 0, sizeof(ss)); strcpy(ss, s[i]); } } char b[N]="{"; int index=0; for(i=MinLen; i>0; i--) { for(j=0; j<=MinLen-i; j++) { char a[N]; memset(a, 0, sizeof(a)); strncpy(a, ss+j, i); for(k=0; k<n; k++) { if(KMP(s[k], a)==0) break; } if(k==n && strcmp(a, b)<0) { index = i; strcpy(b, a); } if(index && j==MinLen-i) i=-1, j=1000; } } if(index) printf("%s\n", b); else printf("IDENTITY LOST\n"); } return 0; }
(KMP 暴力)Corporate Identity -- hdu -- 2328
原文:http://www.cnblogs.com/YY56/p/4844866.html