Cod sursa(job #2557996)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 26 februarie 2020 10:39:16
Problema Seif Scor 0
Compilator cpp-64 Status done
Runda sim11_1 Marime 2.52 kb
#include <fstream>
#include <algorithm>
using namespace std;
int t,n,m,k,r,maxi,i,j,x,y,a,b,ok,x1[2005],x2[2005],ap[300],v1[2005],v2[2005],w1[2005][1005],w2[2005][1005],d[1005][1005];
char ch1[1005],ch2[1005],ch[2005],rs[2005];
int main()
{
    ifstream f("seif.in");
    ofstream g("seif.out");
    f>>t;
    while(t)
    {
        t--;
        f>>k;
        n=0;
        m=0;
        r=0;
        f>>ch1;
        while(ch1[n])
        {
            r++;
            ch[r]=ch1[n];
            n++;
        }
        f>>ch2;
        while(ch2[m])
        {
            r++;
            ch[r]=ch2[m];
            m++;
        }
        sort(ch+1, ch+r+1);
        maxi=0;
        for(i=1; i<=r; i++)
        {
            if(ch[i]!=ch[i-1])
            {
                maxi++;
                ap[ch[i]]=maxi;
                rs[maxi]=ch[i];
            }
        }
        for(i=1; i<=n; i++)
        {
            x=ap[ch1[i-1]];
            v1[i]=x;
            w1[x][0]++;
            w1[x][w1[x][0]]=i;
        }
        for(i=1; i<=m; i++)
        {
            x=ap[ch2[i-1]];
            v2[i]=x;
            w2[x][0]++;
            w2[x][w2[x][0]]=i;
        }
        for(i=1; i<=maxi; i++)
        {
            w1[i][0]++;
            w1[i][w1[i][0]]=n+1;
            w2[i][0]++;
            w2[i][w2[i][0]]=m+1;
        }
        for(i=n; i>=1; i--)
        for(j=m; j>=1; j--)
        {
            d[i][j]=max(d[i+1][j],d[i][j+1]);
            if(v1[i]==v2[j]) d[i][j]=max(d[i][j],d[i+1][j+1]+1);
        }
        a=0;
        b=0;
        while(d[a+1][b+1])
        {
            ok=1;
            i=maxi;
            while(ok)
            {
                while(x1[i]==0||w1[i][x1[i]]<=a) x1[i]++;
                while(x2[i]==0||w2[i][x2[i]]<=b) x2[i]++;
                if(d[w1[i][x1[i]]][w2[i][x2[i]]]&&d[w1[i][x1[i]]][w2[i][x2[i]]]>=k)
                {
                    ok=0;
                    a=w1[i][x1[i]];
                    b=w2[i][x2[i]];
                    k--;
                    g<<rs[v1[a]];
                }
                i--;
            }
        }
        for(i=0; i<=maxi; i++)
        {
            for(j=1; j<=w1[i][0]; j++) w1[i][j]=0;
            for(j=1; j<=w2[i][0]; j++) w2[i][j]=0;
            w1[i][0]=0;
            w2[i][0]=0;
            x1[i]=0;
            x2[i]=0;
        }
        for(i=1; i<=max(n,m); i++)
        {
            v1[i]=0;
            v2[i]=0;
        }
        g<<'\n';
    }
    return 0;
}