//刚开始以为是不要求相连的子串,后来发现是相连的子串,动态规划的时候和不相连的还是有区别的
//c++中的find函数找到的是相连的子串
#include <iostream>
#include <set>
#include <string>
#include <algorithm>
#include <vector>
#define N 63
using namespace std;
int dp[N][N];
int cases,everyCase;
set<string> substrings;
string initial[N],a,b;
void create_common_substr()
{
memset(dp,0,sizeof(dp));
int l1=a.length(),l2=b.length();
int i,j;
for (i=1;i<l1;++i)
{
for (j=1;j<l2;++j)
{
if(a[i]==b[j])
//因为是相邻的最长子串,所以在处理dp的时候如果两个不相等就不用处理了
dp[i][j]=dp[i-1][j-1]+1;
}
}
for (i=1;i<l1;++i)
{
for (j=1;j<l2;++j)
{
if(dp[i][j]>=3)
{
int k=dp[i][j];
//注意截取时候的下标,只用set记录key即可,长度可以求出来,不用浪费空间用map记录长度
string tempsub=a.substr(i-k+1,k);
substrings.insert(tempsub);
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
cin >>cases;
while (cases--)
{
int flag=1,maxLength=0;
substrings.clear();
cin >> everyCase;
cin >> a;
a="X"+a;
cin >> b;
b="Y"+b;
initial[0]=a;
initial[1]=b;
int i=2;
while (i<everyCase)
{
cin >> initial[i];
initial[i]=" "+initial[i];
++i;
}
create_common_substr();
string sub="";
for (set<string>::iterator iter=substrings.begin();iter!=substrings.end();++iter)
{
flag=1;
string cur=*iter;
for (i=0;i<everyCase;++i)
{
if(initial[i].find(cur)==string::npos)
{
flag=0;
break;
}
}
if(flag==1)
{
if(iter->length()>maxLength)
{
maxLength=iter->length();
sub=cur;
}
}
}
if(sub.length()>=3)
cout << sub << endl;
else cout << "no significant commonalities" << endl;
}
}
poj3080
最新推荐文章于 2020-06-16 18:36:58 发布