Pagini recente » Cod sursa (job #2038982) | Cod sursa (job #967143) | Cod sursa (job #3121580) | Cod sursa (job #1346466) | Cod sursa (job #562625)
Cod sursa(job #562625)
# include <fstream>
# include <iostream>
# include <cstring>
# define DIM 1024
# define max(a,b) (a>b?a:b)
using namespace std;
int n, m, k, d[DIM][DIM], p1[DIM][32], p2[DIM][32];
char a[DIM], b[DIM];
void solve ()
{
for(int i=n;i+1;--i)
for(int j=m;j+1;--j)
if (a[i]==b[j])
d[i][j]=d[i+1][j+1]+1;
else
d[i][j]=max(d[i+1][j],d[i][j+1]);
for(int i=n;i+1;--i)
for(int j=0;j<26;++j)
if (a[i]-'A'==j)
p1[i][j]=i;
else
p1[i][j]=p1[i+1][j];
for(int i=m;i+1;--i)
for(int j=0;j<26;++j)
if (b[i]-'A'==j)
p2[i][j]=i;
else
p2[i][j]=p2[i+1][j];
}
void init()
{
for(int i=0;i<=n+1;++i)
for(int j=0;j<=m+1;++j)
d[i][j]=0;
for(int i=0;i<=max(n,m)+1;++i)
for(int j=0;j<26;++j)
p1[i][j]=p2[i][j]=-1;
}
int main()
{
ifstream fin ("seif.in");
freopen("seif.out", "w", stdout);
int t;
fin>>t;
for(;t--;)
{
fin>>k;fin.get();
fin.getline(a,DIM);
fin.getline(b,DIM);
n=strlen(a)-1;
m=strlen(b)-1;
init();
solve ();
int i=0, j=0, c;
for(;i>-1 && j>-1;--k)
{
for(c=25;c+1;--c)
{
if (p1[i][c]!=-1 && p2[j][c]!=-1 && d[p1[i][c]][p2[j][c]]>=k)
{
printf("%c",'A'+c);
i=p1[i][c]+1;
j=p2[j][c]+1;
break;
}
}
if (c==-1)
break;
}
printf("\n");
}
return 0;
}