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 }