Cod sursa(job #1798205)

Utilizator touristGennady Korotkevich tourist Data 4 noiembrie 2016 22:10:16
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 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],nxt1[Nmax][26];

inline void Solve()
{
    int p1=1,p2=1,need=k,i,l=0;
    while(p1<=n && p2<=m)
    {
        int mx,p;
        for(mx=25;mx>=0;--mx)
            if(nxt1[p1][mx] && dp[nxt1[p1][mx]][p2]>=max(need,1))
            {
                p=nxt1[p1][mx]; break;
            }
        if(mx<0) break;
        ans[++l]=char(mx+'A');
        p1=p+1;
        p2=nxt[p2][a[p]-'A']+1;
        --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<26;++i) nxt1[n+1][i]=0;
        for(i=n;i;--i)
        {
            for(j=0;j<26;++j) nxt1[i][j]=nxt1[i+1][j];
            nxt1[i][a[i]-'A']=i;
        }

        for(i=0;i<=n+1;++i) dpmx[i][m+1]=0;
        for(i=0;i<=m+1;++i) dpmx[n+1][i]=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;
}