Pagini recente » Cod sursa (job #1584235) | Cod sursa (job #2485685) | Cod sursa (job #1602036) | Cod sursa (job #449345) | Cod sursa (job #205159)
Cod sursa(job #205159)
# include <stdio.h>
# include <string.h>
using namespace std;
# define FIN "seif.in"
# define FOUT "seif.out"
# define MAXN 1005
# define Alph 27
# define uc unsigned char
int T,N,M,i,j,k,K,ln,lm;
int D[MAXN][MAXN];
char s1[MAXN];
char s2[MAXN];
uc A[MAXN][Alph];
uc B[MAXN][Alph];
int max(int i, int j)
{
if (D[i+1][j]<D[i][j+1])
return D[i][j+1];
return D[i+1][j];
}
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%d",&T);
for (k = 1; k <= T; ++k)
{
scanf("%d\n",&K);
scanf("%s\n",s1+1);
scanf("%s\n",s2+1);
ln = strlen(s1+1);
lm = strlen(s2+1);
for (i = ln; i >= 1; --i)
for (j = lm; j >= 1; --j)
if (s1[i] == s2[j])
D[i][j]=D[i+1][j+1]+1;
else
D[i][j]=max(i,j);
memset(A, 0, sizeof(A));
memset(B, 0, sizeof(B));
for (i = ln; i >= 1; --i)
for (j = 0; j < 26; ++j)
if (s1[i] == j+'A') A[i][j] = i;
else A[i][j] = A[i+1][j];
for (i = lm; i >= 1; --i)
for (j = 0; j < 26; ++j)
if (s2[i] == j+'A') B[i][j] = i;
else B[i][j] = B[i+1][j];
int X,Y;
for (i = 25; i >= 0; --i)
if (D[A[1][i]][B[1][i]]>=K)
{
X = A[1][i];
Y = B[1][i];
K = D[X][Y++]-1;
printf("%c",s1[X++]);
break;
}
while (K != 0)
{
for (i = 25; i >= 0; --i)
if (D[A[X][i]][B[Y][i]]==K)
{
X = A[X][i];
Y = B[Y][i]+1;
K--;
printf("%c",s1[X++]);
break;
}
}
printf("\n");
}
return 0;
}