Pagini recente » Cod sursa (job #1882122) | Cod sursa (job #2617287) | Cod sursa (job #683837) | Cod sursa (job #1004584) | Cod sursa (job #184731)
Cod sursa(job #184731)
//Seif - Stelele informaticii 2008 Clasele 11-12
#include <stdio.h>
#include <string.h>
#define INPUT "seif.in"
#define OUTPUT "seif.out"
#define NMAX 1024
#define SIGMA 32
int T, K;
char A[NMAX], B[NMAX];
//NextA[i][j] - primul index k din i,i+1,..N-1 a.i. A[k] = j+'A'
int NextA[NMAX][SIGMA], NextB[NMAX][SIGMA];
//C[i][j] - lung cmmsc A[i,i+1...N-1] si B[j,j+1,...M-1]
int C[NMAX][NMAX];
inline int max(int A, int B) { return A>B?A:B;}
int main()
{
freopen(INPUT, "r", stdin);
freopen(OUTPUT, "w", stdout);
for(scanf("%d", &T); T; --T)
{
scanf("%d", &K);
scanf("%s\n", A);
scanf("%s\n", B);
int N = strlen(A);
int M = strlen(B);
int i, j;
memset(NextA, -1, sizeof(NextA));
memset(NextB, -1, sizeof(NextB));
for(i = N-1; i >= 0; --i)
for(j = 0; j < 26; ++j) NextA[i][j] = A[i] == j+'A'? i:NextA[i+1][j];
for(i = M-1; i >= 0; --i)
for(j = 0; j < 26; ++j) NextB[i][j] = B[i] == j+'A'? i:NextB[i+1][j];
memset(C, 0, sizeof(C));
for(i = N-1; i >= 0; --i)
for(j = M-1; j >= 0; --j) C[i][j] = A[i]==B[j] ? C[i+1][j+1]+1 : max(C[i+1][j], C[i][j+1]);
int ok = 1, lit; i = 0, j = 0;
while(ok)
{
ok = 0;
for(lit = 25; lit>=0 && !ok; --lit)
if(NextA[i][lit] != -1 && NextB[j][lit] != -1)
{
if(C[NextA[i][lit]][NextB[j][lit]] < K) continue;
printf("%c", lit+'A');
i = NextA[i][lit] + 1;
j = NextB[j][lit] + 1;
ok = 1;
}
--K;
}
printf("\n");
}
return 0;
}