Pagini recente » Cod sursa (job #2491138) | Cod sursa (job #1053779) | Cod sursa (job #1976494) | Cod sursa (job #1266945) | Cod sursa (job #2634665)
#include <bits/stdc++.h>
#define newline '\n'
using namespace std;
ifstream fin("seif.in");
ofstream fout("seif.out");
///***********************
const int NMAX = 1e3 + 5, SIGMA = 'z' - 'a' + 1;
int n, m, k;
char s1[NMAX], s2[NMAX];
int dp[NMAX][NMAX], nxt[2][NMAX][SIGMA];
inline int mapv(char c) {
return c - 'A';
}
void reset() {
memset(dp, 0, sizeof(dp));
for (char c = 'A'; c <= 'Z'; c++)
nxt[0][n + 1][mapv(c)] = nxt[1][m + 1][mapv(c)] = NMAX;
}
void precompute() {
for (int i = n; i; i--)
for (int j = m; j; j--)
if (s1[i] == s2[j])
dp[i][j] = dp[i + 1][j + 1] + 1;
else
dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]);
for (int i = n; i; i--) {
for (char c = 'A'; c <= 'Z'; c++)
nxt[0][i][mapv(c)] = nxt[0][i + 1][mapv(c)];
nxt[0][i][mapv(s1[i])] = i;
}
for (int j = m; j; j--) {
for (char c = 'A'; c <= 'Z'; c++)
nxt[1][j][mapv(c)] = nxt[1][j + 1][mapv(c)];
nxt[1][j][mapv(s2[j])] = j;
}
}
void solve() {
char c;
int i = 1, j = 1;
while (i <= n && j <= m) {
bool ok = false;
for (c = 'Z';!ok && c >= 'A'; c--) {
int p1 = nxt[0][i][mapv(c)];
int p2 = nxt[1][j][mapv(c)];
if (p1 <= n && p2 <= m && dp[p1][p2] >= k) {
fout << s1[p1];
i = p1 + 1;
j = p2 + 1;
ok = true;
k--;
}
}
if (c < 'A' && !ok)
break;
}
fout << newline;
}
int main() {
int q;
for (fin >> q; q--;) {
fin >> k >> (s1 + 1) >> (s2 + 1);
n = strlen(s1 + 1);
m = strlen(s2 + 1);
reset();
precompute();
solve();
}
fout.close();
return 0;
}