Pagini recente » Cod sursa (job #2887388) | Cod sursa (job #3233662) | Cod sursa (job #1539026) | Cod sursa (job #1677717) | Cod sursa (job #2853917)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("seif.in");
ofstream fout("seif.out");
int k, n, m, dp[1005][1005], T;
char s[1005], t[1005];
int urm[3][1005][30];
void Solve()
{
///calc dp
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(s[i] == t[j])
dp[i][j] = dp[i+1][j+1] + 1;
else
dp[i][j] = max(dp[i+1][j], dp[i][j+1]);
for(int i = 0; i < 26; i++)
urm[0][n+1][i] = urm[1][m+1][i] = 1001;
for(int i = n; i >= 1; i--)
{
for(int j = 0; j < 26; j++)
urm[0][i][j] = urm[0][i+1][j];
urm[0][i][s[i] - 'A'] = i;
}
for(int i = m; i >= 1; i--)
{
for(int j = 0; j < 26; j++)
urm[1][i][j] = urm[1][i+1][j];
urm[1][i][t[i] - 'A'] = i;
}
int i, j;
i = j = 1;
while(i <= n && j <= m)
{
int ok = 0;
for(int l = 25; !ok && l >= 0; l--)
{
int p = urm[0][i][l];
int q = urm[1][j][l];
if(p <= n && q <= m && dp[p][q] >= k)
{
fout << s[p];
k--;
ok = 1;
i = p + 1;
j = q + 1;
}
}
if(!ok && j == -1)
break;
}
fout << "\n";
}
int main()
{
fin >> T;
while(T--)
{
fin >> k;
fin >> (s + 1);
fin >> (t + 1);
n = strlen(s + 1);
m = strlen(t + 1);
Solve();
}
return 0;
}