Pagini recente » Cod sursa (job #2712505) | Cod sursa (job #3234527) | Cod sursa (job #1011016) | Cod sursa (job #2542702) | Cod sursa (job #2627237)
#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();
}
}