Pagini recente » Istoria paginii utilizator/mgoganau | Cod sursa (job #214743) | Cod sursa (job #1780940) | Cod sursa (job #210321) | Cod sursa (job #134296)
Cod sursa(job #134296)
#include <cstdio>
#include <cstring>
const int Nmax = 1024;
const int Sigma = 32;
int N, M, K;
char A[Nmax], B[Nmax];
int C[Nmax][Nmax];
int NextA[Nmax][Sigma], NextB[Nmax][Sigma];
inline int max(int a, int b) { return (a > b ? a : b); }
int main() {
freopen("seif.in", "r", stdin);
freopen("seif.out", "w", stdout);
int T;
for (scanf("%d", &T); T; --T) {
scanf("%d", &K);
scanf("%s", A); N = strlen(A);
scanf("%s", B); M = strlen(B);
memset(NextA, -1, sizeof(NextA));
memset(NextB, -1, sizeof(NextB));
for (int i = N-1; i >= 0; --i)
for (int j = 0; j < 26; ++j)
if (A[i] == j+'A') NextA[i][j] = i;
else NextA[i][j] = NextA[i+1][j];
for (int i = M-1; i >= 0; --i)
for (int j = 0; j < 26; ++j)
if (B[i] == j+'A') NextB[i][j] = i;
else NextB[i][j] = NextB[i+1][j];
memset(C, 0, sizeof(C));
for (int i = N-1; i >= 0; --i)
for (int j = M-1; j >= 0; --j)
C[i][j] = A[i] == B[j] ? 1 + C[i+1][j+1] : max(C[i+1][j], C[i][j+1]);
int i = 0, j = 0, next_let;
while (1) {
char found = 0;
for (next_let = 25; next_let >= 0; --next_let)
if (NextA[i][next_let] != -1 && NextB[j][next_let] != -1) {
if (C[NextA[i][next_let]][NextB[j][next_let]] < K) continue;
printf("%c", next_let+'A');
i = NextA[i][next_let]+1, j = NextB[j][next_let]+1;
found = 1;
break;
}
if (!found) break;
--K;
}
printf("\n");
}
}