Cod sursa(job #991598)

Utilizator misinoonisim necula misino Data 30 august 2013 23:25:59
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<fstream>
#include<cstring>
#define N 1010
#define S 26
using namespace std;
ifstream f("seif.in");
ofstream g("seif.out");
int t,k,n,m,i,j,l,pred[N][S],pred1[N][S],d[N][N];
char s1[N],s2[N];
int main()
{
    f>>t;
    for(;t;--t)
    {
        f>>k;
        f>>(s1+1)>>(s2+1);
        memset(d,0,sizeof(d));
        memset(pred,0,sizeof(pred));
        memset(pred1,0,sizeof(pred1));
        n=strlen(s1+1);
        m=strlen(s2+1);
        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+1][j],d[i][j+1]);
        for(i=n;i;--i)
        {
            for(j=0;j<=25;++j)
            {
                pred[i][j]=pred[i+1][j];
            }
            pred[i][s1[i]-'A']=i;
        }
        for(i=m;i;--i)
        {
            for(j=0;j<=25;++j)
            {
                pred1[i][j]=pred1[i+1][j];
            }
            pred1[i][s2[i]-'A']=i;
        }
        for(i=j=1;k>=0||(i<=n&&j<=m);--k)
        {
            for(l=25;l>=0;--l)
            if(pred[i][l]&&pred1[j][l]&&d[pred[i][l]][pred1[j][l]]>=k)
            {
                g<<char(l+'A');
                i=pred[i][l]+1;
                j=pred[j][l]+1;
                break;
            }
            if(l==-1)
            break;
        }
        g<<'\n';
    }
    return 0;
}