Pagini recente » Cod sursa (job #795774) | Cod sursa (job #748110) | Cod sursa (job #2689269) | Cod sursa (job #2348007) | Cod sursa (job #140727)
Cod sursa(job #140727)
#include<stdio.h>
#include<string.h>
#define nmax 1010
int t,q,i,j,aux,pp1,pp2,k,v[nmax][nmax],l1,l2;
int pa[27][nmax], pb[27][nmax];
char a[nmax],b[nmax];
inline int max(int p,int q)
{
if(p>q)
return p;
else
return q;
}
int main()
{
freopen("seif.in","r",stdin);
freopen("seif.out","w",stdout);
scanf("%d",&t);
for(;t>0;t--)
{
scanf("%d\n",&k);
scanf("%s\n",a);
scanf("%s\n",b);
l1=strlen(a);
l2=strlen(b);
memset(pa, 0, sizeof(pa));
memset(pb, 0, sizeof(pb));
for (i = 'A'; i <= 'Z'; i++) {
pa[i - 'A'][l1] = l1;
for (j = l1 - 1; j >= 0; j--)
if (a[j] == i) pa[i - 'A'][j] = j;
else pa[i - 'A'][j] = pa[i - 'A'][j + 1];
}
for (i = 'A'; i <= 'Z'; i++) {
pb[i - 'A'][l2] = l2;
for (j = l2 - 1; j >= 0; j--)
if (b[j] == i) pb[i - 'A'][j] = j;
else pb[i - 'A'][j] = pb[i - 'A'][j + 1];
}
memset(v,0,sizeof(v));
for(i=l1-1;i>=0;i--)
for(j=l2-1;j>=0;j--)
{
if(a[i]==b[j])
v[i][j]=v[i+1][j+1]+1;
else
v[i][j]=max(v[i+1][j],v[i][j+1]);
}
pp1=0;
pp2=0;
while(1)
{
for (i = 'Z'; i >= 'A'; i--) {
j = pa[i - 'A'][pp1];
q = pb[i - 'A'][pp2];
if(j==l1 || q==l2 || v[j][q] < k) continue;
printf("%c",i);
k--;
pp1=j+1;
pp2=q+1;
break;
}
if (i == 'A' - 1) break;
}
printf("\n");
}
return 0;
}