Cod sursa(job #1796204)

Utilizator touristGennady Korotkevich tourist Data 3 noiembrie 2016 10:56:32
Problema Seif Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>
#define Nmax 1005

using namespace std;

char a[Nmax],b[Nmax],ans[Nmax];
int n,m,k,dp[Nmax][Nmax],dpmx[Nmax][Nmax];
int nxt[Nmax][26];

inline void Solve()
{
    int p1=1,p2=1,need=k,i,l=0;
    while(p1<=n && p2<=m)
    {
        int mx=-1,p=0;
        for(i=p1;i<=n;++i)
            if(dp[i][p2]>=max(need,1) && mx < a[i]-'A')
            {
                mx=a[i]-'A'; p=i;
            }
        if(!p) break;
        ans[++l]=char(mx+'A');
        p1=p+1;
        for(;b[p2]!=a[p];++p2);
        ++p2;
        --need;
    }
    ans[l+1]='\0';
}

int main()
{
    int T,i,j;
    ifstream cin("seif.in");
    ofstream cout("seif.out");
    cin>>T;
    while(T--)
    {
        cin>>k>>(a+1)>>(b+1);
        n=strlen(a+1);
        m=strlen(b+1);

        for(i=0;i<26;++i) nxt[m+1][i]=0;
        for(i=m;i;--i)
        {
            for(j=0;j<26;++j) nxt[i][j]=nxt[i+1][j];
            nxt[i][b[i]-'A']=i;
        }

        for(i=0;i<=n+1;++i)
            for(j=0;j<=m+1;++j) dp[i][j]=dpmx[i][j]=0;

        for(i=n;i;--i)
            for(j=m;j;--j)
            {
                int poz=nxt[j][a[i]-'A'];
                dp[i][j]=(poz>0)*(dpmx[i+1][poz+1]+1);
                dpmx[i][j]=max(dp[i][j],dpmx[i+1][j]);
            }

        Solve();
        cout<<(ans+1)<<"\n";
    }

    return 0;
}