Cod sursa(job #257969)

Utilizator mihai0110Bivol Mihai mihai0110 Data 14 februarie 2009 14:17:50
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<stdio.h>
#include<string.h>
#define max(a, b) ((a > b) ? a : b)
#define MAXN 1014
int i,j,n,m,t,k,l,ok;
char s1[MAXN],s2[MAXN],sol[MAXN],c;
int d[MAXN][MAXN],a[27][MAXN],b[27][MAXN];
int main(void)
{
    freopen("seif.in","r",stdin);
    freopen("seif.out","w",stdout);
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&k);
        scanf("%s",s1+1);
        scanf("%s",s2+1);
        s1[0]=' ';
        s2[0]=' ';
        n=strlen(s1)-1;
        m=strlen(s2)-1;
        for(i=1;i<=n;i++)
            d[m+1][i]=0;
        for(i=1;i<=m;i++)
            d[i][n+1]=0;
        for(i=n;i;i--)
        for(j=m;j;j--)
            if(s1[i]==s2[j])
                d[i][j]=d[i+1][j+1]+1;
            else
                d[i][j]=max(d[i][j+1],d[i+1][j]);

        memset(a,-1,sizeof(a));
        memset(b,-1,sizeof(b));

        for(c=0;c<26;c++)
            for(i=n;i>=1;i--)
                if(s1[i]==c+'A')
                    a[c][i]=i;
                else
                    a[c][i]=a[c][i+1];

        for(c=0;c<26;c++)
            for(i=m;i>=1;i--)
                if(s2[i]==c+'A')
                    b[c][i]=i;
                else
                    b[c][i]=b[c][i+1];

        ok=1;
        i=1;j=1,l=0;
        while(ok)
        {
            ok=0;
            for(c=25;c>=0;c--)
            if(a[c][i]!=-1 && b[c][j]!=-1 && d[a[c][i]][b[c][j]] >= k)
            {
                i=a[c][i]+1;
                j=b[c][j]+1;
                printf("%c",c+'A');
                k--;
                ok=1;
                break;
            }
        }
        printf("\n");
    }
    return 0;
}