Cod sursa(job #424103)

Utilizator MarkerOnicas Mircea Marker Data 24 martie 2010 16:32:18
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <stdio.h>
#include <string.h>
#define IN "seif.in"
#define OUT "seif.out"
#define Lg 1010
#define N 27

int mat[Lg][Lg];

char s1[Lg], s2[Lg];
int Poz1[Lg][N] , Poz2[Lg][N];
int Lg1, Lg2 , K, T;

inline int max(int a,int b)
{
    return a>b?a:b;
}

void Read()
{
    scanf ("%d\n", &K);

    fgets(s1, Lg, stdin);
    fgets(s2, Lg, stdin);

    Lg1 = strlen(s1)-2;
    Lg2 = strlen(s2)-2;
}

void solve()
{
    for (int i=Lg1; i>=0; i--)
        for (int j=Lg2; j>=0; j--)
            if (s1[i] == s2[j])
                mat[i][j] = mat[i+1][j+1] + 1;
            else
                mat[i][j] = max(mat[i][j+1], mat[i+1][j]);

    memset(Poz1, 0xff, sizeof(Poz1));
    memset(Poz2, 0xff, sizeof(Poz2));

    for (int i=Lg1; i>=0; i--)
        for (char c='A'; c<='Z'; c++)
            if (s1[i] == c)
                Poz1[i][c - 'A'] = i;
            else
                Poz1[i][c - 'A'] = Poz1[i + 1][c - 'A'];

    for (int i=Lg1; i>=0; i--)
        for (char c='A'; c<='Z'; c++)
            if (s2[i] == c)
                Poz2[i][c - 'A'] = i;
            else
                Poz2[i][c - 'A'] = Poz2[i + 1][c - 'A'];

}

void afish()
{
    int i=0,j=0,ok=1,c;
    while (ok)
    {
       ok = 0;
            for(c=25;c>=0 && !ok;--c)
                if(Poz1[i][c] != -1 && Poz2[j][c] != -1 && mat[Poz1[i][c]][Poz2[j][c]] >= K)
                {
                    printf("%c",c+'A');
                    ok = 1;
                    i = Poz1[i][c]+1;
                    j = Poz2[j][c]+1;
                }
            K--;
    }
    printf("\n");
}

int main ()
{
    freopen (IN ,"r", stdin);
    freopen (OUT ,"w",stdout);
    scanf ("%d", &T);
    while (T)
    {
        T--;
        Read();
        solve();
        afish();
    }
    return 0;
}