Cod sursa(job #134377)

Utilizator astronomyAirinei Adrian astronomy Data 11 februarie 2008 16:27:14
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

#define MAXN 1024

int N, M, K, best[MAXN][MAXN], next1[MAXN][32], next2[MAXN][32];
char A[MAXN], B[MAXN];
string res;

void baga(int i, int j, int k)
{
    if(best[i][j] == 0) return ;
    int p, t, q, p1, p2;
    for(q = 25; q >= 0; q--)
     if((p1=next1[i][q]) <= N && (p2=next2[j][q]) <= M && best[p1][p2] >= k)
     {
        res.push_back('A'+q), baga(p1+1, p2+1, k-1);
        return ;
     }
}

void solve(void)
{
    int i, j, k;

    for(i = 0; i < 26; i++)
     for(next1[N+1][i] = N+1, j = N; j >= 1; j--)
      if(A[j] == 'A'+i) next1[j][i] = j;
      else next1[j][i] = next1[j+1][i];

    for(i = 0; i < 26; i++)
     for(next2[N+1][i] = M+1, j = M; j >= 1; j--)
      if(B[j] == 'A'+i) next2[j][i] = j;
      else next2[j][i] = next2[j+1][i];

    for(i = N; i >= 1; i--)
     for(j = M; j >= 1; j--)
     {
        best[i][j] = max(best[i+1][j], best[i][j+1]);
        if(A[i] == B[j])
            best[i][j] = 1 + best[i+1][j+1];
     }

    baga(1, 1, K);

    cout << res << '\n';
}

void ruleaza(void)
{
    int t;

    scanf("%d\n", &t);

    while(t--)
    {
        memset(best, 0, sizeof(best)), res = "";
        scanf("%d\n", &K);
        scanf("%s\n", A+1), N = strlen(A+1);
        scanf("%s\n", B+1), M = strlen(B+1);
        solve();
    }
}

int main(void)
{
    freopen("seif.in", "rt", stdin);
    freopen("seif.out", "wt", stdout);

    ruleaza();

    return 0;
}