Pagini recente » Cod sursa (job #939005) | Cod sursa (job #3152719) | Cod sursa (job #227259) | Cod sursa (job #872994) | Cod sursa (job #1244961)
#include <fstream>
#include <algorithm>
#include <string>
#include <cstring>
#include <stdio.h>
using namespace std ;
const int NMAX = 1005 ;
const char *fisier = "seif.in";
const char *fisier_out = "seif.out";
int T, K;
char S[5][NMAX] ;
short best[NMAX][NMAX], D[5][NMAX][26], lungime[5] ;
inline int max(int a, int b)
{
return (a > b ? a : b);
}
int main()
{
(fisier, "seif.in", "r");
(fisier_out, "seif.out", "w");
scanf( "%d", &T) ;
while(T -- )
{
scanf( "%d", &K) ;
scanf( "%s", S[0]) ;
scanf("%s", S[1]) ;
for(short i = 0 ; i < 2 ; ++ i)
lungime[i] = strlen(S[i]) ;
memset(D, -1, sizeof(D)) ;
for(int i = 0 ; i < 2 ; ++ i)
for(int j = lungime[i] - 1 ; j >= 0 ; -- j)
for(int k = 0 ; k <= 26 ; ++ k)
{
D[i][j][k] = D[i][j + 1][k] ;
D[i][j][S[i][j] - 'A'] = j ;
}
memset(best, 0, sizeof(best)) ;
for(int i = lungime[0] - 1 ; i >= 0 ; -- i)
for(int j = lungime[1] - 1 ; j >= 0 ; -- j)
best[i][j] = (S[0][i] == S[1][j] ? best[i + 1][j + 1] + 1 : max(best[i + 1][j], best[i][j + 1])) ;
for(int A[ ] = {-1, -1}, stop = 1 ; stop; )
{
stop = 0 ;
for(int i = 25 ; i >= 0 && stop == 0; -- i)
{
int B[ ] = {0, 0} ;
for(int j = 0 ; j < 2 ; ++ j)
B[j] = D[j][A[j] + 1][i] ;
if(B[0] == -1 || B[1] == -1)
continue ;
if(best[B[0]][B[1]] >= K)
{
printf( "%c", i + 'A') ;
memcpy(A, B, sizeof(B)) ;
stop = 1 ;
-- K ;
}
}
}
printf( "\n") ;
}
return 0 ;
}