Pagini recente » Cod sursa (job #2573675) | Rezultatele filtrării | Cod sursa (job #148112) | Borderou de evaluare (job #487370) | Cod sursa (job #134487)
Cod sursa(job #134487)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define PB push_back
#define ALL(X) (X).begin(), (X).end()
const int NMAX = 1024;
const int NLIT = 32;
const int Z = 'Z' - 'A';
int T, K, N, M, L, NR;
char S1[NMAX], S2[NMAX], R[NMAX];
int DP[NMAX][NMAX];
vector <int> P1[NLIT], P2[NLIT];
void dinamica(void) {
int i, j, p1, p2, lp1, lp2;
N = strlen(S1+1);
M = strlen(S2+1);
L = min(N, M);
for (i = 0; i <= Z; ++i)
P1[i].clear(), P2[i].clear();
for (i = 1; i <= N; ++i)
P1[S1[i] - 'A'].PB(i);
for (i = 1; i <= M; ++i)
P2[S2[i] - 'A'].PB(i);
memset(DP, 0x00, sizeof(DP));
for (i = N; i > 0; --i)
for (j = M; j >= 0; --j)
if (S1[i] == S2[j]) {
DP[i][j] = DP[i+1][j+1] + 1;
} else {
if (DP[i+1][j] > DP[i][j+1])
DP[i][j] = DP[i+1][j];
else
DP[i][j] = DP[i][j+1];
}
lp1 = lp2 = 0; NR = 0;
for (i = 1; i <= L; ++i) {
for (j = Z; j >= 0; --j) {
p1 = upper_bound(ALL(P1[j]), lp1) - P1[j].begin();
p2 = upper_bound(ALL(P2[j]), lp2) - P2[j].begin();
if (p1 >= (int)P1[j].size() || p2 >= (int)P2[j].size()) continue;
p1 = P1[j][p1]; p2 = P2[j][p2];
if (i + DP[p1+1][p2+1] >= K) {
R[NR++] = 'A' + j;
lp1 = p1;
lp2 = p2;
break;
}
}
if (j < 0) break;
}
}
int main(void) {
freopen("seif.in", "rt", stdin);
freopen("seif.out", "wt", stdout);
scanf(" %d", &T);
while (T--) {
scanf(" %d", &K);
scanf(" %s %s", S1+1, S2+1);
dinamica();
R[NR] = 0;
printf("%s\n", R);
}
return 0;
}