POJ-3450 Corporate Identity KMP+枚举

  题目链接:http://poj.org/problem?id=3450

  和POJ3080一个意思,都是要你求在n个字符串中,相同字串最长的一个。方法也是KMP+枚举,不过这题的数据大一点。

 1 //STATUS:C++_AC_516MS_380KB

 2 #include<stdio.h>

 3 #include<stdlib.h>

 4 #include<string.h>

 5 #include<math.h>

 6 #include<iostream>

 7 #include<string>

 8 #include<algorithm>

 9 #include<vector>

10 #include<queue>

11 #include<stack>

12 #include<map>

13 using namespace std;

14 #define LL __int64

15 #define pii pair<int,int>

16 #define Max(a,b) ((a)>(b)?(a):(b))

17 #define Min(a,b) ((a)<(b)?(a):(b))

18 #define mem(a,b) memset(a,b,sizeof(a))

19 #define lson l,mid,rt<<1

20 #define rson mid+1,r,rt<<1|1

21 const int N=4010,INF=0x3f3f3f3f,MOD=1999997;

22 const LL LLNF=0x3f3f3f3f3f3f3f3fLL;

23 

24 char s[N][210],ans[210];

25 int next[210],w[N];

26 int n,m;

27 

28 void getnext(char *a,int len)

29 {

30     int j=0,k=-1;

31     next[0]=-1;

32     while(j<len){

33         if(k==-1 || a[k]==a[j])

34             next[++j]=++k;

35         else k=next[k];

36     }

37 }

38 

39 int cmp(char *a,int len)

40 {

41     int i,j,ok,k;

42     for(i=1;i<n;i++){

43         for(j=ok=k=0;j<w[i];j++){

44             while(k>0 && s[i][j]!=a[k])k=next[k];

45             if(s[i][j]==a[k])k++;

46             if(k==len){ok=1;break;}

47         }

48         if(!ok)return 0;

49     }

50     return 1;

51 }

52 

53 int main()

54 {

55  //   freopen("in.txt","r",stdin);

56     int i,j,maxlen,ok,t,lens,minlen;

57     while(~scanf("%d",&n) && n)

58     {

59         minlen=INF;

60         maxlen=-INF;

61         for(i=0;i<n;i++){

62             scanf("%s",s[i]);

63             w[i]=strlen(s[i]);

64             if(w[i]<minlen)minlen=w[i];

65         }

66         for(i=0;i<w[0];i++){

67             for(j=i+1;j<=w[0];j++){

68                 lens=j-i;

69                 if(lens<maxlen || lens>minlen)continue;

70                 getnext(*s+i,lens);

71                 if(cmp(*s+i,lens)){

72                     t=s[0][j];

73                     s[0][j]='\0';

74                     if(lens>maxlen){

75                         maxlen=lens;

76                         strcpy(ans,*s+i);

77                     }

78                     else if(strcmp(ans,*s+i)>0)

79                         strcpy(ans,*s+i);

80                     s[0][j]=t;

81                 }

82             }

83         }

84 

85         printf("%s\n",maxlen>0?ans:"IDENTITY LOST");

86     }

87     return 0;

88 }

 

 

你可能感兴趣的:(entity)