Pagini recente » Cod sursa (job #2508013) | Cod sursa (job #2061222) | Cod sursa (job #2084478) | Cod sursa (job #1925093) | Cod sursa (job #320864)
Cod sursa(job #320864)
#include <cstdio>
#include <cstring>
#define MAX_N 1005
#define SG 26
int N, M, K, T;
char A[MAX_N], B[MAX_N];
int PA[MAX_N][SG], PB[MAX_N][SG];
int L[MAX_N][MAX_N];
inline int Max(const int &A, const int &B)
{
return ((A) > (B))? (A) : (B);
}
void solve()
{
scanf("%d\n%s\n%s\n",&K, A+1, B+1);
N = strlen(A+1);
M = strlen(B+1);
memset(L, 0, sizeof L);
for(int i = N; i; --i)
for(int j = M; j; --j)
L[i][j] = (A[i] == B[j])? (L[i+1][j+1] + 1) : Max(L[i+1][j], L[i][j+1]);
memset(PA, -1, sizeof PA);
for(int i = N; i; --i)
for(int c = 0; c < SG; ++c)
if(A[i] == (c + 'A'))
PA[i][c] = i;
else
PA[i][c] = PA[i+1][c];
memset(PB, -1, sizeof PB);
for(int i = M; i; --i)
for(int c = 0; c < SG; ++c)
if(B[i] == (c + 'A'))
PB[i][c] = i;
else
PB[i][c] = PB[i+1][c];
int i(1), j(1), ok(1);
while(ok)
{
ok = 0;
for(int c = 25; c >= 0; --c)
if((PA[i][c] != -1) && (PB[j][c] != -1) && (L[PA[i][c]][PB[j][c]] >= K))
{
printf("%c",c + 'A');
ok = 1;
i = PA[i][c] + 1;
j = PB[j][c] + 1;
break;
}
--K;
}
printf("\n");
}
int main()
{
freopen("seif.in","rt",stdin);
freopen("seif.out","wt",stdout);
scanf("%d\n",&T);
while(T--)
solve();
}