题意:找多个串中的公共部分,这个公共部分的定义,包括顺序和逆序
关键词:string.find reverse
最短串 暴力(n^3) 枚举子串 substr
串个数<100 串长<100
链接:来自VJ
代码如下:(暴力太久不写也会手生呢!)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<string>
using namespace std;
//maxn列75,maxm行1e4
const int maxn=1e2+5;
string chuan[maxn];
int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
int maxlen=0,minlen=100,len,s=0;
string a,b,c;
for(int i=0;i<n;i++){
cin>>chuan[i];
len=chuan[i].size();
if(len<minlen){//标记最短串
minlen=len;
s=i;
}
}
for(int i=0;i<minlen;i++){//子串 起点
for(int j=1;j<(minlen-i+1);j++){//子串长度
b=chuan[s].substr(i,j);
c=b;
reverse(b.begin(),b.end());//b反转
int sum=1;
for(int k=0;k<n;k++){//逐个字符串匹配
if(k!=s&&(chuan[k].find(b,0)!=chuan[k].npos||chuan[k].find(c,0)!=chuan[k].npos)){
sum++;
}
}
if(sum==n)maxlen=max(maxlen,j);//更新最大值
}
}
cout<<maxlen<<endl;
}
return 0;
}