Cod sursa(job #140474)

Utilizator sealTudose Vlad seal Data 21 februarie 2008 21:32:42
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<stdio.h>
#include<string.h>
#define Nm 1024
#define Sigma 128
#define max(a,b) ((a)>(b)?(a):(b))
char A[Nm],B[Nm];
int M[Nm][Nm],FirstA[Nm][Sigma],FirstB[Nm][Sigma],k;

void solve()
{
    char c;
    int n=strlen(A),m=strlen(B),i,j,a,b;

    for(j=0;j<Sigma;++j)
        FirstA[n][j]=n;
    for(i=n-1;i>=0;--i)
    {
        memcpy(FirstA[i],FirstA[i+1],Sigma*sizeof(int));
        FirstA[i][A[i]-'A']=i;
    }

    for(j=0;j<Sigma;++j)
        FirstB[m][j]=m;
    for(i=m-1;i>=0;--i)
    {
        memcpy(FirstB[i],FirstB[i+1],Sigma*sizeof(int));
        FirstB[i][B[i]-'A']=i;
    }

    for(j=0;j<=m;++j)
        M[n][j]=0;
    for(i=n-1;i>=0;--i)
    {
        M[i][m]=0;
        for(j=m-1;j>=0;--j)
            if(A[i]==B[j])
                M[i][j]=1+M[i+1][j+1];
            else
                M[i][j]=max(M[i+1][j],M[i][j+1]);
    }

    i=0; j=0;
    while(1)
    {
        for(c='Z';c>='A';--c)
        {
            a=FirstA[i][c-'A'];
            b=FirstB[j][c-'A'];
            if(a<n && b<m && M[a][b]>=k)
            {
                printf("%c",c);
                i=a+1; j=b+1;
                break;
            }
        }
        if(c<'A')
            break;
        --k;
    }
    printf("\n");
}

int main()
{
    int t;

    freopen("seif.in","r",stdin);
    freopen("seif.out","w",stdout);

    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%s%s",&k,A,B);
        solve();
    }
    return 0;
}