码迷,mamicode.com
首页 > 其他好文 > 详细

HDU2328 (暴力KMP)

时间:2015-07-17 18:35:34      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2328

题意:输入一个不为0的整数n,再输入n个字符串,求n个字符串的最长公共连续子序列,并保证字典序最小。

题解:直接暴力枚举。

Times:764ms

Memory:1892KB

代码如下:

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 const int maxn = 205;
  7 char s[4005][maxn];
  8 char T[maxn];
  9 char t[maxn];
 10 int Next[maxn];
 11 void getcha(int len,int pos,char *s1)
 12 {
 13     for(int i=0,j=pos;i<len;i++,j++)
 14     {
 15         t[i]=s1[j];
 16     }
 17 //    cout<<t<<endl;
 18 }
 19 void getNext(int len)
 20 {
 21     int i=0,j=-1;
 22     Next[0]=-1;
 23     while(i<len)
 24     {
 25         if(j==-1||t[i]==t[j])
 26             i++,j++,Next[i]=j;
 27         else
 28             j=Next[j];
 29     }
 30 }
 31 int find(char *s1, int len1,int len2)
 32 {
 33     int i=0,j=0;
 34     while(i<len1&&j<len2)
 35     {
 36         if(j==-1||s1[i]==t[j])
 37         i++,j++;
 38         else
 39         j=Next[j];
 40         if(j==len2)
 41             return 1;
 42     }
 43     return 0;
 44 }
 45 int main()
 46 {
 47     int n;
 48     while(~scanf("%d",&n)&&n)
 49     {
 50         int leni[4005]; //统计所有字符串的长度 
 51         int len=300,te=0;
 52         for(int i=0;i<n;i++)
 53         {
 54             scanf("%s",s[i]);
 55             if(strlen(s[i])<len) //找出最短的字符串 
 56             {
 57                 len=strlen(s[i]);
 58                 te = i;
 59             }
 60         }
 61         for(int i=0;i<n;i++)
 62             leni[i]=strlen(s[i]);
 63         int kk=0,kkk=0;
 64         int temp1=0,temp2=-1,temp3; //temp1用来标记该长度是否可以全部匹配,temp2用来记录长度。 
 65         for(int i=len;i>0;i--)//代表所需子串的长度 
 66         {
 67             memset(t,0,sizeof(t));
 68             for(int j=len-i;j>=0;j--)//该长度的所有串 ,j代表起始 位置 
 69             {
 70                 temp1=0;
 71                 getcha(i,j,s[te]);//得到需要匹配的串
 72                 getNext(i);
 73                 for(int k=0;k<n;k++)
 74                 {
 75                     if(k!=te)
 76                     {
 77                         temp1=find(s[k],leni[k],i);
 78                         if(temp1==0)
 79                         {
 80                             break;
 81                         }
 82                     }
 83                 }
 84                 if(temp1)
 85                 {
 86                     kkk=1;
 87                             if(!kk)
 88                             {
 89                                 strcpy(T,t);
 90                                 kk=1;
 91                             }
 92                             else
 93                             {
 94                                 if(strcmp(t,T)<0)
 95                                 {
 96                                     memset(T,0,sizeof(T));
 97                                     strcpy(T,t);
 98                                 }
 99                             }
100                 }
101             }
102         if(kkk==1)
103         break;
104     }
105         if(kkk==0)
106         cout<<"IDENTITY LOST"<<endl;
107         else
108             cout<<T<<endl;
109     }
110 } 

 

HDU2328 (暴力KMP)

标签:

原文地址:http://www.cnblogs.com/ikids/p/4655017.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!