n个点的最长公共子串(别人的模板) poj 3080

没有理解代码。单纯记模板

题意:找最长的公共字串,长度相同就找字典序最小的(这一点wa了我13遍!!!)
题解:kmp或者直接暴力列举
当公共子串长度小于3时,有特判
 1 #include<map>
 2 #include<set>
 3 #include<cmath>
 4 #include<queue>
 5 #include<stack>
 6 #include<vector>
 7 #include<cstdio>
 8 #include<iomanip>
 9 #include<cstdlib>
10 #include<cstring>
11 #include<iostream>
12 #include<algorithm>
13 #define pi acos(-1)
14 #define ll long long
15 #define mod 1000000007
16 #define ls l,m,rt<<1
17 #define rs m+1,r,rt<<1|1
18 
19 using namespace std;
20 
21 const double g=10.0,eps=1e-9;
22 const int N=10+5,maxn=60+5,inf=0x3f3f3f3f;
23 
24 string s[N];
25 int Next[maxn];
26 
27 void getnext(string str,int slen)
28 {
29     int k=-1;
30     Next[0]=-1;
31     for(int i=1;i<slen;i++)
32     {
33         while(k>-1&&str[k+1]!=str[i])k=Next[k];
34         if(str[k+1]==str[i])k++;
35         Next[i]=k;
36     }
37 }
38 bool kmp(string ptr,int plen,string str,int slen)
39 {
40     int k=-1;
41     for(int i=0;i<plen;i++)
42     {
43         while(k>-1&&str[k+1]!=ptr[i])k=Next[k];
44         if(str[k+1]==ptr[i])k++;
45         if(k==slen-1)return 1;
46     }
47     return 0;
48 }
49 int main()
50 {
51     ios::sync_with_stdio(false);
52     cin.tie(0);
53  //   cout<<setiosflags(ios::fixed)<<setprecision(2);
54     int t,n;
55     cin>>t;
56     while(t--){
57         cin>>n;
58         for(int i=0;i<n;i++)cin>>s[i];
59         string ans="";
60         for(int i=1;i<=s[0].size();i++)//长度
61         {
62             for(int j=0;j<=s[0].size()-i;j++)//起点
63             {
64                 string op=s[0].substr(j,i);
65                 getnext(op,op.size());
66                 bool flag=0;
67                 for(int k=1;k<n;k++)
68                     if(!kmp(s[k],s[k].size(),op,op.size()))
69                         flag=1;
70                 if(!flag)
71                 {
72                     if(ans.size()<op.size())ans=op;
73                     else if(ans.size()==op.size())ans=min(ans,op);
74                 }
75             }
76         }
77         if(ans.size()<3)cout<<"no significant commonalities"<<endl;
78         else cout<<ans<<endl;
79     }
80     return 0;
81 }

 

posted @ 2019-11-04 20:23  古比  阅读(128)  评论(0编辑  收藏  举报