Cod sursa(job #134652)
#include <stdio.h>
#include <string.h>
int n, m, c[1002][1002], t, k;
char a[1001], b[1001];
typedef struct nod
{
int i, j;
nod *a;
} *lista;
lista v[30];
void init()
{
int i, j;
for (i = 1; i <= 30; i++) v[i] = NULL;
for (i = 1; i <= n + 1; i++)
for (j = 1; j <= m + 1; j++) c[i][j] = 0;
}
int max(int x, int y) {return x > y ? x : y;}
int main()
{
freopen("seif.in","r",stdin);
freopen("seif.out","w",stdout);
int i, j, ii, jj, ok, nr, l;
lista p;
scanf("%d",&t);
while (t--)
{
scanf("%d",&k);
scanf("%s",&a); scanf("%s",&b);
n = strlen(a); m = strlen(b);
init();
for(i = n; i >= 1; i--)
for (j = m; j >= 1; j--)
if (a[i-1] == b[j-1])
{
c[i][j] = c[i+1][j+1] + 1;
p = new nod;
p -> i = i;
p -> j = j;
p -> a = v[a[i-1] - 'A' + 1];
v[a[i-1] - 'A' + 1] = p;
}
else c[i][j] = max (c[i+1][j],c[i][j+1]);
nr = 0; ok = 1;
ii = 0; jj = 0;
while (ok)
{
ok = 0;
for (l = 28; l >= 1; l--)
{
if (v[l])
{
i = v[l] -> i;
j = v[l] -> j;
while (1)
if (c[i][j] >= k - nr)
{
if (i > ii && j > jj)
{
printf("%c",a[i-1]);
ii = i;
jj = j;
v[l] = v[l] -> a;
nr++;
ok = 1;
break;
}
v[l] = v[l] -> a;
i = v[l] -> i;
j = v[l] -> j;
if (v[l] == NULL) break;
}
else break;
}
}
}
printf("\n");
}
return 0;
}