Strange, this question is modified by poj3080 and AC, but it cannot be used in poj3080. It is strange to say that... Is the RP of Brother's low to this ?!
#include <map>#include <set>#include <list>#include <queue>#include <deque>#include <stack>#include <string>#include <time.h>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define LL long long#define MIN INT_MIN#define MAX INT_MAX#define PI acos(-1.0)#define FRE freopen("input.txt","r",stdin)#define FF freopen("output.txt","w",stdout)#define N 205char str[4005][N];int p[N];int m;int l[N];bool chk(char *ss) { int i,j; int len = strlen(ss+1); p[1] = 0; j = 0; for (i = 2; i <= len; i++) { while (j > 0 && ss[i] != ss[j+1]) { j = p[j]; } if (ss[i] == ss[j+1]) j++; p[i] = j; } for (int kk = 2; kk <= m; kk++) { j = 0; for (i = 1; i <= l[kk]; i++) { while (j > 0 && ss[j+1] != str[kk][i]) { j = p[j]; } if (ss[j+1] == str[kk][i]) j++; if (j == len) break; } if (i > l[kk])return false; } return true;}int main () { while (scanf("%d",&m) && m) { int i,j;// for (i = 1; i <= m; i++) { scanf("%s",str[i]+1); l[i] = strlen(str[i]+1); //printf("!%s\n",str[i]+1); } char ss[N],ans[N]; int maxlen = 0; memset(ans,'\0',sizeof(ans)); for (int len = 1; len <= l[1]; len++) { for (i = 1; i + len <= l[1] + 1; i++) { int cnt = 1; for (j = i; j <= len + i - 1; j++) { ss[cnt++] = str[1][j]; } ss[cnt] = '\0';//printf("!%s\n",ss+1); if (chk(ss)) { if (len == maxlen) { if (strcmp(ans+1,ss+1) > 0) { strcpy(ans+1,ss+1); } } else if (len > maxlen) { maxlen = len; strcpy(ans+1,ss+1); } } } } if (strlen(ans+1) == 0) puts("IDENTITY LOST"); else printf("%s\n",ans+1); } return 0;}