Pagini recente » Cod sursa (job #2880722) | Cod sursa (job #539119) | Cod sursa (job #2582018) | Cod sursa (job #27041) | Cod sursa (job #134377)
Cod sursa(job #134377)
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
#define MAXN 1024
int N, M, K, best[MAXN][MAXN], next1[MAXN][32], next2[MAXN][32];
char A[MAXN], B[MAXN];
string res;
void baga(int i, int j, int k)
{
if(best[i][j] == 0) return ;
int p, t, q, p1, p2;
for(q = 25; q >= 0; q--)
if((p1=next1[i][q]) <= N && (p2=next2[j][q]) <= M && best[p1][p2] >= k)
{
res.push_back('A'+q), baga(p1+1, p2+1, k-1);
return ;
}
}
void solve(void)
{
int i, j, k;
for(i = 0; i < 26; i++)
for(next1[N+1][i] = N+1, j = N; j >= 1; j--)
if(A[j] == 'A'+i) next1[j][i] = j;
else next1[j][i] = next1[j+1][i];
for(i = 0; i < 26; i++)
for(next2[N+1][i] = M+1, j = M; j >= 1; j--)
if(B[j] == 'A'+i) next2[j][i] = j;
else next2[j][i] = next2[j+1][i];
for(i = N; i >= 1; i--)
for(j = M; j >= 1; j--)
{
best[i][j] = max(best[i+1][j], best[i][j+1]);
if(A[i] == B[j])
best[i][j] = 1 + best[i+1][j+1];
}
baga(1, 1, K);
cout << res << '\n';
}
void ruleaza(void)
{
int t;
scanf("%d\n", &t);
while(t--)
{
memset(best, 0, sizeof(best)), res = "";
scanf("%d\n", &K);
scanf("%s\n", A+1), N = strlen(A+1);
scanf("%s\n", B+1), M = strlen(B+1);
solve();
}
}
int main(void)
{
freopen("seif.in", "rt", stdin);
freopen("seif.out", "wt", stdout);
ruleaza();
return 0;
}