Pagini recente » Cod sursa (job #2389991) | Cod sursa (job #2072972) | Cod sursa (job #1188239) | Cod sursa (job #1779086) | Cod sursa (job #134297)
Cod sursa(job #134297)
#include <stdio.h>
#include <string.h>
#define MAXN 1024
int K;
char s[2][MAXN]; int len[2];
int first[2][MAXN][32];
short Max[MAXN][MAXN];
int main()
{
freopen("seif.in", "rt", stdin);
freopen("seif.out", "wt", stdout);
int T;
scanf("%d", &T);
for (; T; T--)
{
memset( s, 0, sizeof(s) );
scanf("%d %s %s", &K, s[0], s[1]);
len[0] = strlen( s[0] );
len[1] = strlen( s[1] );
memset( first, -1, sizeof(first) );
for (int i = 0; i < 2; i++)
{
for (int j = len[i] - 1; j >= 0; j--)
{
for (int k = 0; k <= 'Z' - 'A'; k++)
first[i][j][k] = first[i][j + 1][k];
first[i][j][ s[i][j] - 'A' ] = j;
}
}
memset( Max, 0, sizeof(Max) );
for (int i = len[0] - 1; i >= 0; i--)
for (int j = len[1] - 1; j >= 0; j--)
if (s[0][i] == s[1][j])
Max[i][j] = Max[i + 1][j + 1] + 1;
else
if (Max[i + 1][j] > Max[i][j + 1])
Max[i][j] = Max[i + 1][j];
else
Max[i][j] = Max[i][j + 1];
int poz[2] = {-1, -1};
for (; 1; )
{
int found = 0;
for (int c = 'Z' - 'A'; c >= 0 && !found; c--)
{
int _poz[2];
_poz[0] = first[0][ poz[0] + 1 ][c];
_poz[1] = first[1][ poz[1] + 1 ][c];
if (_poz[0] == -1 || _poz[1] == -1) continue;
if (Max[ _poz[0] ][ _poz[1] ] >= K)
{
printf("%c", c + 'A'); K--;
poz[0] = _poz[0];
poz[1] = _poz[1];
found = 1;
}
}
if (!found)
break;
}
printf("\n");
}
return 0;
}