Pagini recente » Cod sursa (job #585067) | Cod sursa (job #1590068) | Cod sursa (job #2521924) | Cod sursa (job #2746475) | Cod sursa (job #2862024)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("seif.in");
ofstream fout("seif.out");
int t, k;
int dp[1005][1005], nxt[2][1005][30];
char c1[1005], c2[1005];
void solve()
{
int n, m;
n = strlen(c1 + 1);
m = strlen(c2 + 1);
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 (c1[i] == c2[j])
dp[i][j] = 1 + dp[i + 1][j + 1];
else
dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]);
}
}
for (int i = 0; i < 26; i++)
nxt[0][n + 1][i] = nxt[1][m + 1][i] = 1001;
for (int i = n; i >= 1; i--)
{
for (int j = 0; j < 26; j++)
{
nxt[0][i][j] = nxt[0][i + 1][j];
}
nxt[0][i][c1[i] - 'A'] = i;
}
for (int i = m; i >= 1; i--)
{
for (int j = 0; j < 26; j++)
{
nxt[1][i][j] = nxt[1][i + 1][j];
}
nxt[1][i][c2[i] - 'A'] = i;
}
bool ok = false;
int p1, p2, n1, n2, j;
p1 = p2 = 1;
while (p1 <= n && p2 <= m)
{
ok = false;
for (j = 25; !ok && j >= 0; j--)
{
n1 = nxt[0][p1][j];
n2 = nxt[1][p2][j];
if(n1 <= n && n2 <= m && dp[n1][n2] >= k)
{
fout << c1[n1];
ok = true;
p1 = n1 + 1;
p2 = n2 + 1;
k--;
}
}
if(j == -1 && !ok)
break;
}
fout << "\n";
}
void citire()
{
fin >> t;
while (t--)
{
fin >> k;
fin >> (c1 + 1);
fin >> (c2 + 1);
solve();
}
}
int main()
{
citire();
return 0;
}