Cod sursa(job #2003319)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 22 iulie 2017 17:45:06
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<bits/stdc++.h>
using namespace std;
int t,k,n,m,dp[1005][1005];
char a[1005],b[1005];
string s;
int vf,st[1005];
int main()
{
    freopen("seif.in","r",stdin);
    freopen("seif.out","w",stdout);
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&k);
        scanf("%s",a+1);
        scanf("%s",b+1);
        n=strlen(a+1);
        m=strlen(b+1);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(a[i]==b[j]) dp[i][j]=1+dp[i-1][j-1];
                    else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
        int i=n;
        int j=m;
        s.clear();
        int elemente=0;
        while(elemente<dp[n][m])
        {
            if(a[i]==b[j])
            {
                elemente++;
                s.push_back(a[i]);
                i--;
                j--;
            }
                else
            {
                if(dp[i-1][j]<dp[i][j-1] || (dp[i-1][j]==dp[i][j-1] && a[i]>b[j]))
                {
                    j--;
                }
                    else
                    i--;
            }
        }
        reverse(s.begin(),s.end());
        vf=0;
        int elim=s.size()-k;
        int sz=s.size();
       // cerr<<s<<'\n';
        for(int i=0;i<sz;i++)
        {

        while(vf && elim && s[i]>s[st[vf]])
        {
            vf--;
            elim--;
        }
        st[++vf]=i;


        }
        for(int i=1;i<=vf;i++)
            printf("%c",s[st[i]]);
        printf("\n");
    }
    return 0;
}