题目链接: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 }
时间: 2024-11-10 15:18:39