题意:给你n个字符串,问你这里面最长的公共子串的长度是多少,一个公共子串的反串也算,比如样例二;
解题思路:随便找一个字符,枚举它的子串然后跑kmp就行了,很多人的博客都是用string类里面的函数来解决的,学到了。。。
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #define maxn 205 using namespace std; char x[maxn][maxn]; char str[maxn]; char str2[maxn]; int next1[maxn]; int cnt,cot; void get_next(char *t) { int j,k; int tlen=cnt; j=0;k=-1;next1[0]=-1; while(j<tlen) { if(k==-1||t[j]==t[k]) next1[++j]=++k; else k=next1[k]; } } int kmp_pos(char *t,char *s) { int slen=strlen(s); int tlen=cnt; int i=0,j=0; get_next(t); while(i<slen&&j<tlen) { if(j==-1||s[i]==t[j]) { i++;j++; } else j=next1[j]; } if(j==tlen) return i-tlen; return -1; } int main() { int tt; int n; int ans; int maxx; int l; scanf("%d",&tt); while(tt--) { maxx=-1;l=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%s",x[i]); int m=strlen(x[1]); for(int i=0;i<m;i++) { cnt=0; for(int j=i;j<m;j++) { ans=0;cot=0; str[cnt++]=x[1][j]; for(int k=cnt-1;k>=0;k--) str2[cot++]=str[k]; /*for(int k=0;k<cnt;k++) cout<<str[k]; cout<<endl; for(int k=0;k<cnt;k++) cout<<str2[k]; cout<<endl;*/ for(int k=1;k<=n;k++) { int flag1=kmp_pos(str,x[k]); int flag2=kmp_pos(str2,x[k]); if(flag1==-1&&flag2==-1) continue; ans++; } if(ans==n) { l=max(l,cot); } } } printf("%d\n",l); } }
原文地址:https://www.cnblogs.com/huangdao/p/9483414.html
时间: 2024-10-15 15:15:59