Pagini recente » Cod sursa (job #2751419) | Cod sursa (job #2459037) | Cod sursa (job #1170953) | Cod sursa (job #1859728) | Cod sursa (job #138329)
Cod sursa(job #138329)
#include <stdio.h>
#include <string.h>
#define MAX_N 1024
#define FIN "seif.in"
#define FOUT "seif.out"
int T, K, N, M, C[MAX_N][MAX_N], PA[MAX_N][26], PB[MAX_N][26];
char A[MAX_N], B[MAX_N];
int main(void)
{
int i, j, c;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
for (scanf("%d", &T); T; --T)
{
scanf("%d %s %s", &K, A, B);
N = strlen(A);
M = strlen(B);
memset(C, 0, sizeof(C));
memset(PA, -1, sizeof(PA));
memset(PB, -1, sizeof(PB));
for (i = N-1; i >= 0; --i)
for (j = M-1; j >= 0; --j)
if (A[i] == B[j])
C[i][j] = C[i+1][j+1]+1;
else
C[i][j] = C[i][j+1] > C[i+1][j] ? C[i][j+1] : C[i+1][j];
for (i = N-1; i >= 0; --i)
for (j = 0; j < 26; ++j)
PA[i][j] = A[i] == j+'A' ? i : PA[i+1][j];
for (i = M-1; i >= 0; --i)
for (j = 0; j < 26; ++j)
PB[i][j] = B[i] == j+'A' ? i : PB[i+1][j];
for (i = 0, j = 0; i < N && j < M; )
{
for (c = 25; c >= 0; --c)
{
if (PA[i][c] == -1 || PB[j][c] == -1) continue;
if (C[PA[i][c]][PB[j][c]] < K) continue;
printf("%c", c+'A');
i = PA[i][c]+1; j = PB[j][c]+1; --K;
break;
}
if (c == -1) break;
}
printf("\n");
}
return 0;
}