题目大意:给你n个长度小于100的字符串,让你找出他们之间的最长公共子串。其中,如果一个字符串含有另外一个子串的反串,那么这个子串也算做是他们之间的公共子串。
分析:我们可以先找出给出的字符串中长度最小的一个,然后遍历它的所有子串,分别判断这个子串是不是其他字符串的子串。数据量不大,暴力可以过。
实现代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 105
char str[maxn][maxn];
int len[maxn];
int n,mins;
bool judge(int start,int end)
{
int i,j,k;
for(i=0;i<n;i++)
{
if(i==mins) continue;
for(j=0,k=start;j<len[i]&&k<=end;)
if(str[mins][k]==str[i][j])
{
k++;j++;
}
else
{
j=j-(k-start)+1;k=start;
}
if(k>end) continue;
for(j=0,k=end;j<len[i]&&k>=start;)
if(str[mins][k]==str[i][j])
{
k--;j++;
}
else
{
j=j-(end-k)+1;k=end;
}
if(k>=start) return 0;
}
return 1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d",&n);
int minl=maxn;
for(int i=0;i<n;i++)
{
scanf("%s",str[i]);
len[i]=strlen(str[i]);
if(minl>len[i])
{
minl=len[i];
mins=i;
}
}
int ans=0;
for(int i=0;i<len[mins];i++)
for(int j=0;j<=i;j++)
if(judge(j,i)&&ans<(i-j+1))
ans=i-j+1;
printf("%d\n",ans);
}
return 0;
}