Pagini recente » Cod sursa (job #2397092) | Cod sursa (job #286580) | Cod sursa (job #1257908) | Statistici Rasid Cetin (Rasid_Cetin_321CA) | Cod sursa (job #2558097)
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
ifstream fin ("seif.in");
ofstream fout ("seif.out");
int t, n, m, k, dp[1002][1002], nexta[1002][26], nextb[1002][26];
string a, b;
int main()
{
fin >> t;
while (t--) {
fin >> k >> a >> b;
n = a.size();
m = b.size();
a = '#' + a;
b = '#' + b;
memset(dp, 0, sizeof(dp));
memset(nexta, 0, sizeof(nexta));
memset(nextb, 0, sizeof(nextb));
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;
dp[i][j] = max(dp[i][j], dp[i][j + 1]);
dp[i][j] = max(dp[i][j], dp[i + 1][j]);
}
for (int i = n; i >= 1; i--) {
for (int j = 0; j < 26; j++) {
if (a[i] - 'A' == j)
nexta[i][j] = i;
else
nexta[i][j] = nexta[i + 1][j];
}
}
for (int i = m; i >= 1; i--)
for (int j = 0; j < 26; j++)
if (b[i] - 'A' == j)
nextb[i][j] = i;
else
nextb[i][j] = nextb[i + 1][j];
int i = 1, j = 1;
while (i <= n && j <= m) {
bool ok = 0;
for (int l = 25; l >= 0; l--) {
if (nexta[i][l] != 0 && nextb[j][l] != 0 && dp[nexta[i][l]][nextb[j][l]] >= k && dp[nexta[i][l]][nextb[j][l]] > 0) {
k--;
fout << (char)(l + 'A');
i = nexta[i][l] + 1;
j = nextb[j][l] + 1;
ok = 1;
break;
}
}
if (!ok)
break;
}
fout << "\n";
}
return 0;
}