Cod sursa(job #2735836)

Utilizator NeganAlex Mihalcea Negan Data 2 aprilie 2021 21:17:18
Problema Seif Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("seif.in");
ofstream fout("seif.out");

const int NMAX = 1005;

int t, n, m, k;
char a[NMAX], b[NMAX];
int dp[NMAX][NMAX];
int urm[2][NMAX][30];
inline void Solve()
{
    int i, j;
    n = strlen(a + 1);
    m = strlen(b + 1);
    for(i = 1;i <= n + 1;   i++)
        for(j = 1;j <= m + 1;j++)
            dp[i][j] = 0;
    for(i = n;i >= 1;i--)
        for(j = m;j >= 1;j--)
            if(a[i] == b[j])
                dp[i][j] = 1 + dp[i + 1][j + 1];
            else
                dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]);
    for(i = 0;i < 26;i++)
        urm[0][n + 1][i] = urm[1][m + 1][i] = NMAX;
    for(i = n;i >= 1;i--)
    {
        for(j = 0;j < 26;j++)
            urm[0][i][j] = urm[0][i + 1][j];
        urm[0][i][a[i] - 'A'] = i;
    }
    for(i = m;i >= 1;i--)
    {
        for(j = 0;j < 26;j++)
            urm[1][i][j] = urm[1][i + 1][j];
        urm[1][i][b[i] - 'A'] = i;
    }
    int q, p, ok, l1, l2;
    q = p = 1;
    while(q <= n && p <= m)
    {
        ok = 0;
        for(j = 25;j >= 0;j--)
        {
            l1 = urm[0][q][j];
            l2 = urm[1][p][j];
            if(l1 <= n && l2 <= m && dp[l1][l2] >= k)
            {
                fout << a[l1];
                ok = 1;
                q = l1 + 1;
                p = l2 + 1;
                k--;
            }
        }
        if(j == -1 && ok == 0)
            break;
    }
    fout << "\n";

}

void Citire()
{
    fin >> t;
    while(t--)
    {
        fin >> k;
        fin >> (a + 1);
        fin >> (b + 1);
        Solve();
    }
    fout.close();
}
int main()
{
    Citire();
    return 0;
}