poj 3080 Blue Jeans

题目要求很清楚,就是求n(n<=10)个字符串的最长公共子串,由于题目数据量不大,直接枚举和KMP就可以,注最长公共子串长度小于3的特别输出,有几个长度相等的最长公共子串,输出字典序最小的。另外,string中的find函数就是实现了KMP算法。

View Code
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int m,n;
 8     int t;
 9     int i,j,k;
10     string dna[10];
11     string s,str;
12     cin>>n;
13     bool flag;
14     for(k=0;k<n;k++)
15     {
16         cin>>t;
17         for(i=0;i<t;i++)
18             cin>>dna[i];
19 
20         //从大到小枚举所有子串
21         j=dna[0].length();
22         while(j>=3)
23         {
24             i=0;
25             while(i+j<=dna[0].length())
26             {
27                 flag=true;
28                 s=dna[0].substr(i,j);
29                 for(m=1;m<t;m++)
30                 {
31                     if(dna[m].find(s)==string::npos)
32                     {
33                         flag=false;
34                         break;
35                     }
36                 }
37                 if(flag)
38                     break;
39                 i++;
40             }
41             if(flag)
42                 break;
43             j--;
44         }
45         if(! flag)
46             cout<<"no significant commonalities"<<endl;
47         else
48         {
49             j=s.length();
50             i=0;
51             while(i+j<=dna[0].length())
52             {
53                 flag=true;
54                 str=dna[0].substr(i,j);
55                 for(m=1;m<t;m++)
56                 {
57                     if(dna[m].find(str)==string::npos)
58                     {
59                         flag=false;
60                         break;
61                     }
62                 }
63                 if(flag && s>str)
64                     s=str;
65                 i++;
66             }
67             cout<<s<<endl;
68         }
69     }
70 
71     return 0;
72 }

 

posted @ 2012-06-04 19:02  vpanda  阅读(141)  评论(0)    收藏  举报