Cod sursa(job #1004971)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 3 octombrie 2013 21:10:08
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#include <string.h>
#define NMAX 1005
#define LMAX 27
int t,k,n,m,C[NMAX][NMAX];
int D[NMAX][LMAX],E[NMAX][LMAX];
char A[NMAX],B[NMAX];
inline int lit(char x)
{
    return x>='A' && x<='Z';
}
void read()
{
    scanf("%d\n%s\n%s\n",&k,A+1,B+1);
    n=strlen(A+1);
    m=strlen(B+1);
}
inline int max(int x,int y)
{
    return x>y ? x : y;
}
void cmlsc()
{
    memset(C,0,sizeof(C));
    memset(D,0,sizeof(D));
    memset(E,0,sizeof(E));
    int i,j;
    for (i=n; i>=1; i--)
        for (j=m; j>=1; j--)
            if (A[i]==B[j])
                C[i][j]=C[i+1][j+1]+1;
            else
                C[i][j]=max(C[i+1][j],C[i][j+1]);
}
void compute_info()
{
    int i,j;
    for (i=n; i>=1; i--)
        for (j=0; j<=26; j++)
        {
            if (A[i]=='A'+j)
                D[i][j]=i;
            else
                D[i][j]=D[i+1][j];
        }
    for (i=m; i>=1; i--)
        for (j=0; j<=26; j++)
        {
            if (B[i]=='A'+j)
                E[i][j]=i;
            else
                E[i][j]=E[i+1][j];
        }
}
void solve()
{
    cmlsc();
    compute_info();
    int i,j,ind1=1,ind2=1,poz1,poz2,ok=1;
    for (i=1; ok ; i++)
    {
        ok=0;
        for (j=26; j>=0; j--)
        {
            poz1=D[ind1][j]; poz2=E[ind2][j];
            if (poz1 && poz2 && C[poz1][poz2]>=k)
            {
                ok=1;  k--;
                ind1=poz1+1; ind2=poz2+1;
                printf("%c",'A'+j);
                break ;
            }
        }
    }
    printf("\n");
}
int main()
{
    freopen("seif.in","r",stdin);
    freopen("seif.out","w",stdout);
    scanf("%d\n",&t);
    while (t--)
    {
        read();
        solve();
    }
    return 0;
}