Cod sursa(job #562625)

Utilizator loginLogin Iustin Anca login Data 23 martie 2011 16:47:44
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
# include <fstream>
# include <iostream>
# include <cstring>
# define DIM 1024
# define max(a,b) (a>b?a:b)
using namespace std;
int n, m, k, d[DIM][DIM], p1[DIM][32], p2[DIM][32];
char a[DIM], b[DIM];

void solve ()
{
	for(int i=n;i+1;--i)
		for(int j=m;j+1;--j)
			if (a[i]==b[j])
				d[i][j]=d[i+1][j+1]+1;
			else
				d[i][j]=max(d[i+1][j],d[i][j+1]);
	for(int i=n;i+1;--i)
		for(int j=0;j<26;++j)
			if (a[i]-'A'==j)
				p1[i][j]=i;
			else
				p1[i][j]=p1[i+1][j];
	for(int i=m;i+1;--i)
		for(int j=0;j<26;++j)
			if (b[i]-'A'==j)
				p2[i][j]=i;
			else
				p2[i][j]=p2[i+1][j];
}

void init()
{
	for(int i=0;i<=n+1;++i)
		for(int j=0;j<=m+1;++j)
			d[i][j]=0;
	for(int i=0;i<=max(n,m)+1;++i)
		for(int j=0;j<26;++j)
			p1[i][j]=p2[i][j]=-1;
}

int main()
{
	ifstream fin ("seif.in");
	freopen("seif.out", "w", stdout);
	int t;
	fin>>t;
	for(;t--;)
	{
		fin>>k;fin.get();
		fin.getline(a,DIM);
		fin.getline(b,DIM);
		n=strlen(a)-1;
		m=strlen(b)-1;
		init();
		solve ();
		int i=0, j=0, c;
		for(;i>-1 && j>-1;--k)
		{
			for(c=25;c+1;--c)
			{
				if (p1[i][c]!=-1 && p2[j][c]!=-1 && d[p1[i][c]][p2[j][c]]>=k)
				{
					printf("%c",'A'+c);
					i=p1[i][c]+1;
					j=p2[j][c]+1;
					break;
				}
			}
			if (c==-1)
				break;
		}
		printf("\n");
	}
	return 0;
}