Pagini recente » Cod sursa (job #668239) | Cod sursa (job #1177978) | Cod sursa (job #2266935) | Cod sursa (job #1049912) | Cod sursa (job #1806307)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("seif.in");
ofstream fout("seif.out");
const int nmax = 1005;
char s1[nmax],s2[nmax];
int T,N,M,K,dp[nmax][nmax];
int nxt[2][nmax][30];
inline void Precalc()
{
int i,j;
for(i = N; i < nmax - 1; i++)
for(j = M; j < nmax - 1; j++)
dp[i][j] = 0;
for(i = N; i >= 1; i--)
for(j = M; j >= 1; j--)
if(s1[i] == s2[j])
dp[i][j] = 1 + dp[i+1][j+1];
else dp[i][j] = max(dp[i+1][j],dp[i][j+1]);
for(i = 0; i < 26; i++)
nxt[0][N+1][i] = nxt[1][M+1][i] = nmax - 3;
for(i = N; i >= 1; i--)
{
for(j = 0; j < 26; j++)
nxt[0][i][j] = nxt[0][i+1][j];
nxt[0][i][s1[i]-'A'] = i;
}
for(i = M; i >= 1; i--)
{
for(j = 0; j < 26; j++)
nxt[1][i][j] = nxt[1][i+1][j];
nxt[1][i][s2[i]-'A'] = i;
}
}
inline void Solve()
{
int p1,p2,j,ok,n1,n2;
N = strlen(s1 + 1);
M = strlen(s2 + 1);
Precalc();
p1 = p2 = 1;
while(p1 <= N && p2 <= M)
{
ok = 0;
for(j = 25;!ok && j >= 0; j--)
{
n1 = nxt[0][p1][j];
n2 = nxt[1][p2][j];
if(n1 <= N && n2 <= M && dp[n1][n2] >= K)
{
fout << s1[n1];
ok = 1;
p1 = n1 + 1; p2 = n2 + 1;
K--;
}
}
if(j == -1 && !ok) break;
}
fout << "\n";
}
int main()
{
fin >> T;
while(T--)
{
fin >> K;
fin >> (s1 + 1);
fin >> (s2 + 1);
Solve();
}
fout.close();
return 0;
}