Pagini recente » Cod sursa (job #3220895) | Cod sursa (job #2676165) | Cod sursa (job #1638642) | Cod sursa (job #999601) | Cod sursa (job #140474)
Cod sursa(job #140474)
#include<stdio.h>
#include<string.h>
#define Nm 1024
#define Sigma 128
#define max(a,b) ((a)>(b)?(a):(b))
char A[Nm],B[Nm];
int M[Nm][Nm],FirstA[Nm][Sigma],FirstB[Nm][Sigma],k;
void solve()
{
char c;
int n=strlen(A),m=strlen(B),i,j,a,b;
for(j=0;j<Sigma;++j)
FirstA[n][j]=n;
for(i=n-1;i>=0;--i)
{
memcpy(FirstA[i],FirstA[i+1],Sigma*sizeof(int));
FirstA[i][A[i]-'A']=i;
}
for(j=0;j<Sigma;++j)
FirstB[m][j]=m;
for(i=m-1;i>=0;--i)
{
memcpy(FirstB[i],FirstB[i+1],Sigma*sizeof(int));
FirstB[i][B[i]-'A']=i;
}
for(j=0;j<=m;++j)
M[n][j]=0;
for(i=n-1;i>=0;--i)
{
M[i][m]=0;
for(j=m-1;j>=0;--j)
if(A[i]==B[j])
M[i][j]=1+M[i+1][j+1];
else
M[i][j]=max(M[i+1][j],M[i][j+1]);
}
i=0; j=0;
while(1)
{
for(c='Z';c>='A';--c)
{
a=FirstA[i][c-'A'];
b=FirstB[j][c-'A'];
if(a<n && b<m && M[a][b]>=k)
{
printf("%c",c);
i=a+1; j=b+1;
break;
}
}
if(c<'A')
break;
--k;
}
printf("\n");
}
int main()
{
int t;
freopen("seif.in","r",stdin);
freopen("seif.out","w",stdout);
scanf("%d",&t);
while(t--)
{
scanf("%d%s%s",&k,A,B);
solve();
}
return 0;
}