Cod sursa(job #425342)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 25 martie 2010 17:51:43
Problema Seif Scor 100
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 1020
#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()
{
    s1[0]=s2[0]='-';
    scanf("%d\n",&K);
    scanf("%s\n",s1+1);
    scanf("%s\n",s2+1);
    Lg1 = strlen(s1+1);
    Lg2 = strlen(s2+1);
}

void solve()
{
    memset(mat,0,sizeof(mat));

    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=Lg2; 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'];

    int i=1,j=1,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();
    }
    return 0;
}