Pagini recente » Cod sursa (job #2803310) | Cod sursa (job #2729299) | Borderou de evaluare (job #1825101) | Cod sursa (job #2798910) | Cod sursa (job #134723)
Cod sursa(job #134723)
#include <stdio.h>
#include <string.h>
int main()
{
freopen("seif.in", "r", stdin);
freopen("seif.out", "w", stdout);
short int c[1024][1024], n, m, test, k, first[26][1000], second[26][1000], cnt, p1[26], p2[26], t, i, j, ok, last1, last2;
char a[1024], b[1024], sol[1024];
scanf("%hd ", &t);
for(test = 0; test < t; ++test)
{
memset(c, 0, sizeof(c));
memset(first, 0, sizeof(first));
memset(second, 0, sizeof(second));
cnt = 0;
last1 = last2 = 0;
scanf(" %hd ", &k);
fgets(a, 1024, stdin);
scanf(" ");
n = strlen(a) - 1;
for(i = 0; i < n; ++i)
{
first[a[i] - 'A'][++first[a[i] - 'A'][0]] = i;
}
fgets(b, 1024, stdin);
scanf(" ");
m = strlen(b) - 1;
for(i = 0; i < m; ++i)
{
second[b[i] - 'A'][++second[b[i] - 'A'][0]] = i;
}
for(i = n - 1; i >= 0; --i)
{
for(j = m - 1; j >= 0; --j)
{
c[i][j] = c[i][j + 1];
if(c[i][j] < c[i + 1][j])
{
c[i][j] = c[i + 1][j];
}
if(a[i] == b[j] && c[i][j] < c[i + 1][j + 1] + 1)
{
c[i][j] = c[i + 1][j + 1] + 1;
}
}
}
ok = 1;
for(i = 0; i <= 25; ++i)
{
p1[i] = 1;
p2[i] = 1;
}
while(ok)
{
ok = 0;
for(i = 25; i >= 0; --i)
{
if(p1[i] <= first[i][0] && p2[i] <= second[i][0] && (c[first[i][p1[i]] + 1][second[i][p2[i]] + 1] + cnt + 1 >= k))
{
sol[++cnt] = 'A' + i;
last1 = first[i][p1[i]];
last2 = second[i][p2[i]];
++p1[i];
++p2[i];
ok = 1;
break;
}
}
//printf("last: %hd %hd\n", last1, last2);
if(ok)
printf("%c", sol[cnt]);
for(i = 0; i <= 25; ++i)
{
while(first[i][p1[i]] <= last1 && p1[i] <= first[i][0])
++p1[i];
while(second[i][p2[i]] <= last2 && p2[i] <= second[i][0])
++p2[i];
}
}
printf("\n");
}
return 0;
}