Pagini recente » Cod sursa (job #675355) | Cod sursa (job #3242429) | Cod sursa (job #1022526) | Cod sursa (job #3125485) | Cod sursa (job #145522)
Cod sursa(job #145522)
#include <stdio.h>
#include <string.h>
#define fin "seif.in"
#define fout "seif.out"
const int Nmax = 1010;
const int sigma = 26;
int T,K,N,M,dp[Nmax][Nmax];
int next1[Nmax][sigma],next2[Nmax][sigma];
char buff1[Nmax],buff2[Nmax];
int maxf(int a,int b) { return ( a > b ) ? ( a ) : ( b ); };
void readsolve()
{
int i,j,k;
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%i",&T);
while ( T -- )
{
scanf("%i\n",&K);
fgets(buff1 + 1,Nmax,stdin);
fgets(buff2 + 1,Nmax,stdin);
for ( N = 1; buff1[N] != '\n'; ++N);
--N;
for ( M = 1; buff2[M] != '\n'; ++M);
--M;
memset(next1,0,sizeof(next1));
memset(next2,0,sizeof(next2));
memset(dp,0,sizeof(dp));
for ( i = N; i > 0; --i )
memcpy(next1[i],next1[i+1],sizeof(next1[i+1])),next1[i][buff1[i]-'A']=i;
for ( i = M; i > 0; --i )
memcpy(next2[i],next2[i+1],sizeof(next2[i+1])),next2[i][buff2[i]-'A']=i;
for ( i = N; i > 0; --i )
for ( j = M; j > 0; --j )
if ( buff1[i] == buff2[j] )
dp[i][j] = dp[i+1][j+1] + 1;
else
dp[i][j] = maxf(dp[i+1][j],dp[i][j+1]);
i = 1; j = 1;
dp[0][0] = 0;
for ( ; K; K -- )
{
for ( k = sigma - 1; k >= 0; --k )
if ( dp[ next1[i][k] ][ next2[j][k] ] >= K )
{
i = next1[i][k] + 1;
j = next2[j][k] + 1;
printf("%c",k+'A');
break;
}
}
printf("\n");
}
}
int main()
{
readsolve();
return 0;
}