Cod sursa(job #2558048)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 26 februarie 2020 11:27:36
Problema Seif Scor 0
Compilator cpp-64 Status done
Runda sim11_1 Marime 1.91 kb
#include <fstream>
#include <algorithm>
using namespace std;
int t,n,m,k,i,j,ok,a,b,v1[1005],v2[1005],x[1005],y[1005],w1[300][1005],w2[300][1005],d[1005][1005];
char ch,ch1[1005],ch2[1005];
int main()
{
    ifstream f("seif.in");
    ofstream g("seif.out");
    f>>t;
    while(t)
    {
        t--;
        f>>k;
        n=0;
        m=0;
        for(i=1; i<=27; i++)
        {
            x[i]=1;
            y[i]=1;
            w1[i][0]=0;
            w2[i][0]=0;
        }
        f>>ch1;
        while(ch1[n])
        {
            n++;
            v1[n]=ch1[n-1]-'A'+1;
            w1[v1[n]][0]++;
            w1[v1[n]][w1[v1[n]][0]]=n;
        }
        f>>ch2;
        while(ch2[m])
        {
            m++;
            v2[m]=ch2[m-1]-'A'+1;
            w2[v2[m]][0]++;
            w2[v2[m]][w2[v2[m]][0]]=m;
        }
        for(i=1; i<=27; 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]);
            d[i][j]=max(d[i][j],d[i+1][j+1]+(v1[i]==v2[j]));
        }
        a=0;
        b=0;
        while(d[a+1][b+1])
        {
            ok=1;
            i='Z'-'A'+1;
            while(ok)
            {
                if(i==1)
                {
                    i=1;
                }
                while(w1[i][x[i]]<=a) x[i]++;
                while(w2[i][y[i]]<=b) y[i]++;
                if(d[w1[i][x[i]]][w2[i][y[i]]]&&d[w1[i][x[i]]][w2[i][y[i]]]>=k)
                {
                    ok=0;
                    k--;
                    ch=i+'A'-1;
                    g<<ch;
                    a=w1[i][x[i]];
                    b=w2[i][y[i]];
                }
                i--;
            }
        }
        g<<'\n';
    }
    return 0;
}