Pagini recente » Monitorul de evaluare | Cod sursa (job #3123500) | Cod sursa (job #95997) | Cod sursa (job #2122444) | Cod sursa (job #353386)
Cod sursa(job #353386)
#include <cstdio>
#include <cstring>
using namespace std;
int t,cnt;
char s1[1002], s2[1002];
int sir1[1002][27], sir2[1002][27];
int mat[1002][1002];
int l1,l2;
int maxim(int x, int y)
{
return x>y?x:y;
}
int main()
{
freopen("seif.in","r",stdin);
freopen("seif.out","w",stdout);
scanf("%d",&t);
for(int x=0;x<t;x++)
{
scanf("%d\n",&cnt);
gets(s1);
gets(s2);
l1 = strlen(s1);
l2 = strlen(s2);
for(int i=0;i<1002;i++)
for(int j=0;j<27;j++)
sir1[i][j]=sir2[i][j]=-1;
for(int i=l1-1;i>=0;i--)
for(int j=0;j<26;j++)
if(s1[i] == 'A'+j)
sir1[i][j]=i;
else
sir1[i][j]=sir1[i+1][j];
for(int i=l2-1;i>=0;i--)
for(int j=0;j<26;j++)
if(s2[i]=='A'+j)
sir2[i][j]=i;
else
sir2[i][j]=sir2[i+1][j];
for(int i=l1-1;i>=0;i--)
for(int j=l2-1;j>=0;j--)
if(s1[i]==s2[j])
mat[i][j]=mat[i+1][j+1]+1;
else
mat[i][j]=maxim(mat[i+1][j],mat[i][j+1]);
int da=1;
int i=0,j=0;
while(da)
{
da=0;
for(int zz=25;zz>=0&&da==0;zz--)
if(sir1[i][zz]!=-1 && sir2[j][zz]!=-1)
if(mat[sir1[i][zz]][sir2[j][zz]]>=cnt)
{
printf("%c", zz+'A');
i = sir1[i][zz] + 1;
j = sir2[j][zz] + 1;
da = 1;
}
cnt--;
}
printf("\n");
}
return 0;
}