TRIP-LCS方案輸出

首先肯定是要求lcs的,這個我懶得講了。。。

因爲lcs最多就是這個串的長度,所以我們可以考慮dfs。我們開2個數組,f1[i][j]表示在a串中,f2[i][j]表示在b串中,i之後的第一個‘a’+j在什麼地方。

#include <bits/stdc++.h>

using namespace std;
const int maxn=1005;
int T;int tot=0;
string s1,s2;
int f[maxn][maxn],f1[maxn][maxn],f2[maxn][maxn];
string ans[maxn];
void print(int i,int j)
{
	if(i==0||j==0) return;
	if(f[i][j]==f[i-1][j-1]+1)
	{
		print(i-1,j-1);
		
	}
}
void find(int n1,int n2,string s,int l)
{
	if(n1<0||n2<0) return ;
	if(l<=0) {ans[++tot]=s;return;}
	for(int i=1;i<=26;i++)
	{
		int p1=f1[i][n1],p2=f2[i][n2];
		if(f[p1][p2]!=l) continue;
		char ch=i+96;
		find(p1-1,p2-1,ch+s,l-1);
	}
}
void work()
{
	tot=0;
	cin>>s1>>s2;
	int n1=s1.size(),n2=s2.size();
	s1='.'+s1;s2='.'+s2;
	memset(f,0,sizeof(f));memset(f1,0,sizeof(f1));memset(f2,0,sizeof(f2));
	for(int i=1;i<=26;i++)
	{
		for(int j=1;j<=n1;j++)
		{
			if(s1[j]==i+96) f1[i][j]=j;
			else f1[i][j]=f1[i][j-1];
		}
		for(int j=1;j<=n2;j++)
		{
			if(s2[j]==i+96) f2[i][j]=j;
			else f2[i][j]=f2[i][j-1];
		}
	}
	for(int i=1;i<=n1;i++)
	{
		for(int j=1;j<=n2;j++)
		{
			f[i][j]=max(f[i-1][j],f[i][j-1]);
			if(s1[i]==s2[j])
			{
				f[i][j]=max(f[i][j],f[i-1][j-1]+1);
			}
		}
	}
	find(n1,n2,"",f[n1][n2]);
//	cout<<f[n1][n2]<<endl;
//	print(n1,n2);
	sort(ans+1,ans+1+tot);
	for(int i=1;i<=tot;i++) cout<<ans[i]<<endl;
}
int main()
{
	scanf("%d",&T);
	for(int ti=1;ti<=T;ti++)
	{
		work();
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章