Cod sursa(job #2735806)

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

using namespace std;

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

int t, n, m, k;
char a[1010], b[1010];
int dp[1010][1010];
int urm[2][1010][30];
void Solve()
{
    int i, j;
    dp[0][0] = 1;
    n = strlen(a + 1);
    m = strlen(b + 1);
    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] = 1003;
    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();
    }
}
int main()
{
    Citire();
    return 0;
}