Cod sursa(job #353386)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 4 octombrie 2009 21:58:05
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#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;
}