Pagini recente » Cod sursa (job #839744) | Cod sursa (job #1724912) | Cod sursa (job #172821) | Cod sursa (job #104580) | Cod sursa (job #143691)
Cod sursa(job #143691)
#include <stdio.h>
#include <string.h>
#define maxim(a, b) ((a > b) ? a : b)
#define INF 32000
#define NMax 1024
int M, N, K;
short int D[NMax][NMax], fA[26][NMax], fB[26][NMax];
char A[NMax], B[NMax], sol[NMax]; int cnt;
int main(void)
{
int T, i, j, c;
freopen("seif.in", "r", stdin);
freopen("seif.out", "w", stdout);
for (scanf("%d", &T); T; T--)
{
scanf("%d %s %s", &K, A, B);
for (M = 0; A[M] >= 'A' && A[M] <= 'Z'; ++M);
for (N = 0; B[N] >= 'A' && B[N] <= 'Z'; ++N);
for (i = M; i; --i) A[i] = A[i-1]; A[0] = ' ';
for (i = N; i; --i) B[i] = B[i-1]; B[0] = ' ';
for (i = 0; i <= N+1; ++i)
D[M+1][i] = 0;
for (i = 0; i <= M+1; ++i)
D[i][N+1] = 0;
for (i = M; i; --i)
for (j = N; j; --j)
if (A[i] == B[j])
D[i][j] = 1 + D[i+1][j+1];
else
D[i][j] = maxim(D[i+1][j], D[i][j+1]);
for (c = 0; c < 26; ++c)
for (i = M, fA[c][M+1] = INF; i; --i)
if (A[i] == c + 'A')
fA[c][i] = i;
else
fA[c][i] = fA[c][i+1];
for (c = 0; c < 26; ++c)
for (i = N, fB[c][N+1] = INF; i; --i)
if (B[i] == c + 'A')
fB[c][i] = i;
else
fB[c][i] = fB[c][i+1];
for (i = j = cnt = 0, c = 25; c >= 0; )
for (c = 25; c >= 0; --c)
if (fA[c][i+1] <= M && fB[c][j+1] <= N && D[fA[c][i+1]][fB[c][j+1]] >= K - cnt)
{
i = fA[c][i+1];
j = fB[c][j+1];
sol[cnt++] = 'A' + c;
break;
}
for (i = 0; i < cnt; ++i)
printf("%c", sol[i]);
printf("\n");
}
return 0;
}