Cod sursa(job #2862024)

Utilizator andreimocianAndrei Mocian andreimocian Data 4 martie 2022 20:05:59
Problema Seif Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

int t, k;
int dp[1005][1005], nxt[2][1005][30];
char c1[1005], c2[1005];

void solve()
{
    int n, m;
    n = strlen(c1 + 1);
    m = strlen(c2 + 1);
    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 (c1[i] == c2[j])
                dp[i][j] = 1 + dp[i + 1][j + 1];
            else
                dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]);
        }
    }

    for (int i = 0; i < 26; i++)
        nxt[0][n + 1][i] = nxt[1][m + 1][i] = 1001;

    for (int i = n; i >= 1; i--)
    {
        for (int j = 0; j < 26; j++)
        {
            nxt[0][i][j] = nxt[0][i + 1][j];
        }
        nxt[0][i][c1[i] - 'A'] = i;
    }

    for (int i = m; i >= 1; i--)
    {
        for (int j = 0; j < 26; j++)
        {
            nxt[1][i][j] = nxt[1][i + 1][j];
        }
        nxt[1][i][c2[i] - 'A'] = i;
    }

    bool ok = false;
    int p1, p2, n1, n2, j;
    p1 = p2 = 1;
    while (p1 <= n && p2 <= m)
    {
        ok = false;
        for (j = 25; !ok && j >= 0; j--)
        {
            n1 = nxt[0][p1][j];
            n2 = nxt[1][p2][j];
            if(n1 <= n && n2 <= m && dp[n1][n2] >= k)
            {
                fout << c1[n1];
                ok = true;
                p1 = n1 + 1;
                p2 = n2 + 1;
                k--;
            }
        }
        if(j == -1 && !ok)
        break;
    }
    fout << "\n";
}

void citire()
{
    fin >> t;
    while (t--)
    {
        fin >> k;
        fin >> (c1 + 1);
        fin >> (c2 + 1);
        solve();
    }
}

int main()
{
    citire();
    return 0;
}