首先肯定是要求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;
}