Pagini recente » Cod sursa (job #2113108) | Cod sursa (job #304968) | Monitorul de evaluare | Cod sursa (job #1250946) | Cod sursa (job #205166)
Cod sursa(job #205166)
# include <stdio.h>
# include <string.h>
using namespace std;
# define FIN "seif.in"
# define FOUT "seif.out"
# define MAXN 1024
# define Alph 32
# define max(a,b) (a>b?a:b)
int T,N,M,i,j,l,K,ln,lm,k;
int D[MAXN][MAXN];
char s1[MAXN];
char s2[MAXN];
int A[MAXN][Alph];
int B[MAXN][Alph];
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%d",&T);
for (k = 1; k <= T; ++k)
{
scanf("%d\n",&K);
scanf("%s\n",s1+1);
scanf("%s\n",s2+1);
ln = strlen(s1+1);
lm = strlen(s2+1);
for (i = ln; i >= 1; --i)
for (j = lm; j >= 1; --j)
if (s1[i] == s2[j])
D[i][j]=D[i+1][j+1]+1;
else
D[i][j]=max(D[i+1][j],D[i][j+1]);
memset(A, -1, sizeof(A));
memset(B, -1, sizeof(B));
for (i = ln; i >= 1; --i)
for (j = 0; j < 26; ++j)
if (s1[i] == j+'A') A[i][j] = i;
else A[i][j] = A[i+1][j];
for (i = lm; i >= 1; --i)
for (j = 0; j < 26; ++j)
if (s2[i] == j+'A') B[i][j] = i;
else B[i][j] = B[i+1][j];
i = 1; j = 1;
int ok = 1;
while (ok)
{
ok = 0;
for (l = 25; l>=0&&!ok; --l)
if (A[i][l]!=-1&&B[j][l]!=-1&&D[A[i][l]][B[j][l]]>=K)
{
printf("%c",l+'A');
i = A[i][l]+1;
j = B[j][l]+1;
ok = 1;
}
K--;
}
printf("\n");
}
return 0;
}