Pagini recente » Cod sursa (job #2490852) | Cod sursa (job #2788142) | Cod sursa (job #3246486) | Cod sursa (job #3214024) | Cod sursa (job #2735815)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("seif.in");
ofstream fout("seif.out");
int t, n, m, k;
char a[1010], b[1010];
int dp[1010][1010];
int urm[2][1010][30];
void Solve()
{
int i, j;
n = strlen(a + 1);
m = strlen(b + 1);
for(i = 1;i <= n + 1;i++)
for(j = 1;j <= m + 1;j++)
dp[i][j] = 0;
for(i = n;i >= 1;i--)
for(j = m;j >= 1;j--)
if(a[i] == b[j])
dp[i][j] = 1 + dp[i + 1][j + 1];
else
dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]);
for(i = 0;i < 26;i++)
urm[0][n + 1][i] = urm[1][m + 1][i] = 1003;
for(i = n;i >= 1;i--)
{
for(j = 0;j < 26;j++)
urm[0][i][j] = urm[0][i + 1][j];
urm[0][i][a[i] - 'A'] = i;
}
for(i = m;i >= 1;i--)
{
for(j = 0;j < 26;j++)
urm[1][i][j] = urm[1][i + 1][j];
urm[1][i][b[i] - 'A'] = i;
}
int q, p, ok, l1, l2;
q = p = 1;
while(q <= n && p <= m)
{
ok = 0;
for(j = 25;j >= 0;j--)
{
l1 = urm[0][q][j];
l2 = urm[1][p][j];
if(l1 <= n && l2 <= m && dp[l1][l2] >= k)
{
fout << a[l1];
ok = 1;
q = l1 + 1;
p = l2 + 1;
k--;
}
}
if(j == -1 && ok == 0)
break;
}
fout << "\n";
}
void Citire()
{
fin >> t;
while(t--)
{
fin >> k;
fin >> (a + 1);
fin >> (b + 1);
Solve();
}
}
int main()
{
Citire();
return 0;
}