Pagini recente » Cod sursa (job #2483181) | Cod sursa (job #766159) | Cod sursa (job #1552993) | Cod sursa (job #633217) | Cod sursa (job #2044492)
#include <bits/stdc++.h>
const int MAXN = (int) 1e3;
const int SIGMA = 26;
char A[MAXN + 1], B[MAXN + 1];
int dp[MAXN + 2][MAXN + 2];
std::vector <int> inda[SIGMA], indb[SIGMA];
std::vector <char> sol;
inline int get_next(std::vector <int> ind, char ch, int pos) {
int rez = -1;
for(int pas = 1 << 9; pas; pas >>= 1)
if(rez + pas < ind.size() && ind[rez + pas] <= pos)
rez += pas;
rez++;
if(rez == ind.size())
return -1;
return ind[rez];
}
int main() {
FILE *fi, *fout;
int t, i, j, n, m, k;
char ch;
fi = fopen("seif.in" ,"r");
fout = fopen("seif.out" ,"w");
fscanf(fi,"%d " ,&t);
while(t > 0) {
t--;
fscanf(fi,"%d " ,&k);
fscanf(fi,"%s %s " , A + 1, B + 1);
n = strlen(A + 1);
m = strlen(B + 1);
memset(dp, 0, sizeof(dp));
for(i = n; i >= 1; i--) {
for(j = m; j >= 1; j--) {
if(A[i] == B[j])
dp[i][j] = dp[i + 1][j + 1] + 1;
else
dp[i][j] = std::max(dp[i + 1][j], dp[i][j + 1]);
}
}
for(i = 0; i < SIGMA; i++) {
inda[i].clear();
indb[i].clear();
}
for(i = 1; i <= n; i++)
inda[A[i] - 'A'].push_back(i);
for(i = 1; i <= m; i++)
indb[B[i] - 'A'].push_back(i);
sol.clear();
int posa = 0, posb = 0;
while(1) {
for(ch = 25; ch >= 0; ch--) {
int pa = get_next(inda[ch], ch, posa), pb = get_next(indb[ch], ch, posb);
if(pa > -1 && pb > -1 && dp[pa][pb] >= k) {
posa = pa;
posb = pb;
k--;
sol.push_back(ch + 'A');
break;
}
}
if(ch == -1)
break ;
}
for(auto it : sol)
fputc(it, fout);
fputc('\n', fout);
}
fclose(fi);
fclose(fout);
return 0;
}