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 }


浙公网安备 33010602011771号