Pagini recente » Cod sursa (job #1301621) | Cod sursa (job #1328494) | Cod sursa (job #1749599) | Cod sursa (job #1620530) | Cod sursa (job #1559659)
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream fin("seif.in");
ofstream fout("seif.out");
const int MAXNM = 1055;
const int MAXC = 26;
char a[MAXNM], b[MAXNM];
int urma[MAXC][MAXNM], urmb[MAXC][MAXNM];
int cmlsc[MAXNM][MAXNM];
int N, M, T, K;
void Solve();
int main()
{
fin >> T;
for ( ; T > 0; T-- )
{
fin >> K; fin.get();
fin.getline(a + 1, MAXNM);
fin.getline(b + 1, MAXNM);
N = strlen(a + 1);
M = strlen(b + 1);
Solve();
}
fin.close();
fout.close();
return 0;
}
void Solve()
{
int i, j, k;
bool ok;
for ( i = 0; i < MAXC; i++ )
urma[i][N + 1] = urmb[i][M + 1] = 0;
for ( i = 0; i <= N + 1; i++ )
cmlsc[i][M + 1] = cmlsc[i][0] = 0;
for ( i = 0; i <= M + 1; i++ )
cmlsc[N + 1][i] = cmlsc[M + 1][0] = 0;
for ( i = N; i >= 1; i-- )
for ( j = M; j >= 1; j-- )
{
cmlsc[i][j] = max( cmlsc[i + 1][j], cmlsc[i][j + 1] );
if ( a[i] == b[j] )
cmlsc[i][j] = max( cmlsc[i][j], cmlsc[i + 1][j + 1] + 1 );
}
for ( i = MAXC - 1; i >= 0; i-- )
{
for ( j = N; j >= 0; j-- )
{
if ( a[j + 1] - 'A' != i )
urma[i][j] = urma[i][j + 1];
else
urma[i][j] = j + 1;
}
}
for ( i = MAXC - 1; i >= 0; i-- )
{
for ( j = M; j >= 0; j-- )
{
if ( b[j + 1] - 'A' != i )
urmb[i][j] = urmb[i][j + 1];
else
urmb[i][j] = j + 1;
}
}
i = j = 0;
while (1)
{
ok = false;
for ( k = MAXC - 1; k >= 0; k-- )
if ( cmlsc[urma[k][i]][urmb[k][j]] >= K && cmlsc[urma[k][i]][urmb[k][j]] > 0 )
{
ok = true;
K--;
fout << (char)( 'A' + k );
i = urma[k][i];
j = urmb[k][j];
break;
}
if ( !ok )
break;
}
fout << '\n';
}