Cod sursa(job #2853917)

Utilizator robertanechita1Roberta Nechita robertanechita1 Data 20 februarie 2022 18:43:45
Problema Seif Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

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

int k, n, m, dp[1005][1005], T;
char s[1005], t[1005];
int urm[3][1005][30];

void Solve()
{
    ///calc dp
    for(int i = 1; i <= n + 1; i++)
        for(int j = 1; j <= m + 1; j++)
            dp[i][j] = 0;
    for(int i = n; i >= 1; i--)
        for(int j = m; j >= 1; j--)
        if(s[i] == t[j])
            dp[i][j] = dp[i+1][j+1] + 1;
        else
            dp[i][j] = max(dp[i+1][j], dp[i][j+1]);
    for(int i = 0; i < 26; i++)
        urm[0][n+1][i] = urm[1][m+1][i] = 1001;
    for(int i = n; i >= 1; i--)
    {
        for(int j = 0; j < 26; j++)
            urm[0][i][j] = urm[0][i+1][j];
        urm[0][i][s[i] - 'A'] = i;
    }
    for(int i = m; i >= 1; i--)
    {
        for(int j = 0; j < 26; j++)
            urm[1][i][j] = urm[1][i+1][j];
        urm[1][i][t[i] - 'A'] = i;
    }
    int i, j;
    i = j = 1;
    while(i <= n && j <= m)
    {
        int ok = 0;
        for(int l = 25; !ok && l >= 0; l--)
        {
            int p = urm[0][i][l];
            int q = urm[1][j][l];
            if(p <= n && q <= m && dp[p][q] >= k)
            {
                fout << s[p];
                k--;
                ok = 1;
                i = p + 1;
                j = q + 1;
            }
        }
        if(!ok && j == -1)
            break;
    }
    fout << "\n";
}

int main()
{
    fin >> T;
    while(T--)
    {
        fin >> k;
        fin >> (s + 1);
        fin >> (t + 1);
        n = strlen(s + 1);
        m = strlen(t + 1);
        Solve();
    }
    return 0;
}