Pagini recente » Borderou de evaluare (job #996878) | Borderou de evaluare (job #202445) | Borderou de evaluare (job #202458) | Borderou de evaluare (job #234080) | Cod sursa (job #2589204)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("seif.in");
ofstream fout("seif.out");
int main() {
int t; fin >> t;
while (t--) {
int k; fin >> k;
string a; fin >> a; int m = a.size(); a = '*' + a;
string b; fin >> b; int n = b.size(); b = '*' + b;
vector<vector<int>> dp(m + 2, vector<int>(n + 2));
for (int i = m; i >= 1; i--)
for (int j = n; j >= 1; j--)
if (a[i] == b[j])
dp[i][j] = dp[i + 1][j + 1] + 1;
else
dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]);
vector<vector<int>> nextA(m + 1, vector<int>(26, m + 1));
for (int i = m - 1; i >= 0; i--) {
for (int x = 0; x < 26; x++)
nextA[i][x] = nextA[i + 1][x];
nextA[i][a[i + 1] - 'A'] = i + 1;
}
vector<vector<int>> nextB(n + 1, vector<int>(26, n + 1));
for (int j = n - 1; j >= 0; j--) {
for (int x = 0; x < 26; x++)
nextB[j][x] = nextB[j + 1][x];
nextB[j][b[j + 1] - 'A'] = j + 1;
}
for (int i = 0, j = 0; k >= 1; k--) {
bool ok = false;
for (int x = 25; x >= 0; x--)
if (nextA[i][x] <= m && nextB[j][x] <= n && dp[nextA[i][x]][nextB[j][x]] >= k) {
fout << (char) (x + 'A');
k = dp[nextA[i][x]][nextB[j][x]];
i = nextA[i][x];
j = nextB[j][x];
ok = true;
break;
}
if (!ok) {
fout << -1;
break;
}
}
fout << '\n';
}
fout.close();
return 0;
}