poj3080

//刚开始以为是不要求相连的子串,后来发现是相连的子串,动态规划的时候和不相连的还是有区别的
//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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值