Pagini recente » Cod sursa (job #2733906) | Cod sursa (job #2575753) | Cod sursa (job #379416) | Cod sursa (job #2051596) | Cod sursa (job #253389)
Cod sursa(job #253389)
#include <stdio.h>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 1010
#define maxalf 26
#define max(a,b) (a > b ? a : b)
int n, m, k, l;
char a[maxn], b[maxn];
int c[maxn][maxn];
vector <int> p1[maxalf];
vector <int> p2[maxalf];
int g1[maxn], g2[maxn];
char sol[maxn];
int main()
{
freopen("seif.in", "r", stdin);
freopen("seif.out", "w", stdout);
int i, j, T, found;
for (scanf("%d ", &T) ; T; T--)
{
scanf("%d ", &k);
scanf("%s ", a+1);
scanf("%s ", b+1);
n = strlen(a+1);
m = strlen(b+1);
reverse(a+1, a+n+1);
reverse(b+1, b+m+1);
for (i=0; i<maxalf; i++)
{
p1[i].clear();
p2[i].clear();
}
for (i=1; i<=n; i++) p1[a[i]-'A'].push_back(i);
for (i=1; i<=m; i++) p2[b[i]-'A'].push_back(i);
for (i=0; i<maxalf; i++)
{
g1[i] = p1[i].size() - 1;
g2[i] = p2[i].size() - 1;
}
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
if (a[i] == b[j]) c[i][j] = c[i-1][j-1] + 1;
else c[i][j] = max(c[i-1][j], c[i][j-1]);
found = 1;
l = 0;
while (found)
{
found = 0;
for (i=maxalf-1; i>=0; i--)
{
while (g1[i]>=0 && p1[i][g1[i]]>n) g1[i]--;
while (g2[i]>=0 && p2[i][g2[i]]>m) g2[i]--;
if (g1[i]>=0 && g2[i]>=0 && c[p1[i][g1[i]]][p2[i][g2[i]]]>=k)
{
n = p1[i][g1[i]] - 1;
m = p2[i][g2[i]] - 1;
sol[++l] = 'A' + i;
found = 1;
break;
}
}
k--;
}
for (i=1; i<=l; i++) printf("%c", sol[i]);
printf("\n");
}
return 0;
}