Pagini recente » Cod sursa (job #1345702) | Cod sursa (job #1926992) | Cod sursa (job #756707) | Cod sursa (job #3131285) | Cod sursa (job #205163)
Cod sursa(job #205163)
# include <stdio.h>
# include <string.h>
using namespace std;
# define FIN "seif.in"
# define FOUT "seif.out"
# define MAXN 1024
# define Alph 32
# define uc unsigned char
int T,N,M,i,j,l,K,ln,lm,k;
int D[MAXN][MAXN];
char s1[MAXN];
char s2[MAXN];
uc A[MAXN][Alph];
uc B[MAXN][Alph];
inline int max(int A, int B)
{
return A>B?A:B;
}
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, 0, sizeof(A));
memset(B, 0, 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 = 0;
while (!ok && i<=ln && j <= lm)
{
ok = 1;
for (l = 25; l>=0&&ok==1; --l)
if (A[i][l]!=0 && B[j][l]!=0)
{
if (D[A[i][l]][B[j][l]] < K) continue;
printf("%c",l+'A');
i = A[i][l]+1;
j = B[j][l]+1;
ok = 0;
}
K--;
}
printf("\n");
}
return 0;
}