POJ 3450

二分长度,枚举字串,KMP判断。

View Code
 1 #include<cstdio>

 2 #include<algorithm>

 3 #include<cstring>

 4 using namespace std;

 5 char s[4005][205];

 6 char ans[205];

 7 int next[205],n;

 8 void getnext(char sr[])

 9 {

10     int i,j;

11     i=0;j=-1;next[0]=-1;

12     for(;sr[i]!='\0';)

13     {

14         if(j==-1||sr[i]==sr[j])

15         {

16             next[++i]=++j;

17         }

18         else

19         {

20             j=next[j];

21         }

22     }

23 }

24 bool kmp(char dr[],char sr[])

25 {

26     int i,j;

27     for(i=j=0;dr[i]!='\0';)

28     {

29         if(j==-1||sr[j]==dr[i])

30         {

31             i++;j++;

32             if(sr[j]=='\0')

33                 return true;

34         }

35         else

36         {

37             j=next[j];

38         }

39     }

40     return false;

41 }

42 bool solve(int len)

43 {

44     bool flag=false;

45     int mm=strlen(s[0]),i,j;

46     for(i=0,j;i+len<=mm;i++)

47     {

48         if(flag)

49         {

50             if(strncmp(ans,&s[0][i],len)>0)

51             {

52                 char sr[205];

53                 memcpy(sr,&s[0][i],len*sizeof(char));

54                 sr[len]='\0';

55                 getnext(sr);

56                 for(j=1;j<n;j++)

57                     if(!kmp(s[j],sr))

58                         break;

59                 if(j==n)

60                     strcpy(ans,sr);

61             }

62         }

63         else

64         {

65             char sr[205];

66             memcpy(sr,&s[0][i],len*sizeof(char));

67             sr[len]='\0';

68             getnext(sr);

69             for(j=1;j<n;j++)

70                 if(!kmp(s[j],sr))

71                     break;

72             if(j==n)

73                 strcpy(ans,sr),flag=true;

74         }

75     }

76     return flag;

77 }

78 int main()

79 {

80     while(scanf("%d",&n)&&n)

81     {

82         for(int i=0;i<n;i++)

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

84         strcpy(ans,"IDENTITY LOST");

85         int ll=1,rr=205,mid;

86         while(ll<=rr)

87         {

88             mid=(ll+rr)>>1;

89             if(solve(mid))

90                 ll=mid+1;

91             else

92                 rr=mid-1;

93         }

94         printf("%s\n",ans);

95     }

96     return 0;

97 }

你可能感兴趣的:(poj)