Cod sursa(job #138329)

Utilizator dominoMircea Pasoi domino Data 18 februarie 2008 12:33:17
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#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;
}