Pagini recente » Cod sursa (job #2894550) | Cod sursa (job #2140790) | Cod sursa (job #1031044) | Cod sursa (job #490743) | Cod sursa (job #1007098)
#include<stdio.h>
#include<cstring>
#define maxdim 1005
#define alfa 26
FILE*f=fopen("seif.in","r");
FILE*g=fopen("seif.out","w");
int n,m,k;
int D[maxdim][maxdim],next1[maxdim][alfa],next2[maxdim][alfa];
char A[maxdim],B[maxdim];
inline int max ( const int &a , const int &b ){
return a >= b ? a : b;
}
inline void citire () {
fscanf(f,"%d\n",&k);
fscanf(f,"%s%s",A+1,B+1);
n = strlen(A+1),m = strlen(B+1);
}
inline void cmlsc () {
for ( int i = n ; i >= 1 ; --i ){
for ( int j = m ; j >= 1 ; --j ){
if ( A[i] == B[j] ){
D[i][j] = D[i+1][j+1]+1;
}
else{
D[i][j] = max(D[i+1][j],D[i][j+1]);
}
}
}
}
inline void build_next () {
for ( int j = 0 ; j < alfa ; ++j ){
next1[n+1][j] = next2[m+1][j] = 0;
}
for ( int i = n ; i >= 1 ; --i ){
for ( int j = 0 ; j < alfa ; ++j ) next1[i][j] = next1[i+1][j];
next1[i][ A[i]-'A' ] = i;
}
for ( int i = m ; i >= 1 ; --i ){
for ( int j = 0 ; j < alfa ; ++j ) next2[i][j] = next2[i+1][j];
next2[i][ B[i]-'A' ] = i;
}
}
inline void solve () {
cmlsc();
build_next();
int x = 0,y = 0;
for ( ; ; ){
int found = 0;
for ( int ch = alfa-1 ; ch >= 0 ; --ch ){
int x2 = next1[x+1][ch],y2 = next2[y+1][ch];
if ( x2 == 0 || y2 == 0 ) continue ;
if ( D[x2][y2] >= k ){
fprintf(g,"%c",ch+'A');
--k; found = 1;
x = x2,y = y2;
break ;
}
}
if ( !found ) break ;
}
fprintf(g,"\n");
}
int main () {
int tests;
fscanf(f,"%d",&tests);
while ( tests-- ){
citire();
solve();
}
fclose(f);
fclose(g);
return 0;
}