Cod sursa(job #2627237)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 10 iunie 2020 10:50:39
Problema Seif Scor 0
Compilator cpp-64 Status done
Runda simulare_oni_11-12.... Marime 1.82 kb
#include <bits/stdc++.h>

using namespace std;

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

const int DIM = 1002;
const int sigma = 26;

int dp[DIM][DIM];
int urmA[DIM][sigma];
int urmB[DIM][sigma];

void solve()
{
    int k;
    fin >> k;

    string a, b;
    fin >> a >> b;

    a = ' ' + a;
    b = ' ' + b;

    int n = a.size() - 1;
    int m = b.size() - 1;

    dp[n][m] = 0;
    dp[n + 1][m] = 0;
    dp[n][m + 1] = 0;

    for(int i = n; i >= 1; --i)
        for(int j = m; j >= 1; --j)
            if(a[i] == b[j])
                dp[i][j] = dp[i + 1][j + 1] + 1;
            else
                dp[i][j] = max(dp[i][j + 1], dp[i + 1][j]);

    for(int ch = 0; ch < sigma; ++ch)
    {
        urmA[n + 1][ch] = n + 1;
        urmB[m + 1][ch] = m + 1;
    }

    for(int i = n; i >= 1; --i)
    {
        for(int ch = 0; ch < sigma; ++ch)
            urmA[i][ch] = urmA[i + 1][ch];

        urmA[i][a[i] - 'A'] = i;
    }

    for(int i = m; i >= 1; --i)
    {
        for(int ch = 0; ch < sigma; ++ch)
            urmB[i][ch] = urmB[i + 1][ch];

        urmB[i][b[i] - 'A'] = i;
    }

    int l = 1;
    int r = 1;

    while(l <= n && r <= m)
    {
        bool ok = true;

        for(int ch = 25; ch >= 0; --ch)
        {
            int pA = urmA[l][ch];
            int pB = urmB[r][ch];

            if(pA > n || pB > m)
                continue;

            if(dp[pA][pB] >= k)
            {
                fout << char('A' + ch);
                --k;
                l = pA + 1;
                r = pB + 1;
                ok = false;
                break;
            }
        }

        if(ok)
            break;
    }

    fout << '\n';
}

main()
{
    int t;
    fin >> t;

    for(; t; --t)
    {
        solve();
    }
}