Cod sursa(job #135176)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 13 februarie 2008 11:35:01
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <stdio.h>
#include <string.h>

#define fin  "seif.in"
#define fout "seif.out"

#define DxBG

const int Nmax = 1011;

int T,K,N,M;
int dp[Nmax][Nmax];
char txt1[Nmax],txt2[Nmax];

int len(char s[])
{
	int i;

	for ( i = 1; s[i] != '\n'; ++i );

	return i - 1;
}

int max(int a,int b) { return ( a > b ) ? ( a ) : ( b ); }

void compute_dp(int dp[][Nmax],char a[],char b[],int len_a,int len_b)
{
	int i,j;

	memset(dp,0,sizeof(dp));

	for ( i = len_a; i > 0; --i )
	for ( j = len_b; j > 0; --j )
	{
		if ( a[i] == b[j] )
			dp[i][j] = dp[i+1][j+1] + 1;
		else
			dp[i][j] = dp[i+1][j];
		dp[i][j] = max(dp[i][j],dp[i+1][j]);
		dp[i][j] = max(dp[i][j],dp[i][j+1]);
	}

#ifdef DBG
	printf("%i %i\n",len_a,len_b);

	for ( i = 1; i <= len_a; ++i )
	{
		for ( j = 1; j <= len_b; ++j )
			printf("%i ",dp[i][j]);
		printf("\n");
	}
#endif

}

void compute_greedy(int dp[][Nmax],char a[],char b[],int len_a,int len_b,int lim)
{
	int i,j,len_max = 0,poz;
	char bst[Nmax];
	char car_ales;

	memset(bst,0,sizeof(bst));

	for ( i = 1; i <= len_a; ++i )
	for ( j = 1; j <= len_b; ++j )
	{
		if ( a[i] == b[j] )
			bst[ dp[i][j] ] = max(bst[ dp[i][j] ],a[i]);
		len_max = max(dp[i][j],len_max);
	}

#ifdef DBG
	for ( i = 1; i <= len_max; ++i )
		printf("%c ",bst[i]);
	printf("\n");
#endif

	for ( i = lim; i > 0; --i )
	{
		car_ales = 'A' - 1;
		for ( j = len_max; j >= i; --j )
			if ( bst[j] > car_ales )
			{
				car_ales = bst[j];
				poz = j;
			}
		printf("%c",bst[poz]); //car_ales);
		bst[poz]='A' - 1;
	}

	printf("\n");
}

void read_solve()
{
	int i;

	freopen(fin,"r",stdin);
	freopen(fout,"w",stdout);

	scanf("%i",&T);

	while ( T -- )
	{
		scanf("%i\n",&K);

		fgets(txt1+1,Nmax,stdin);
		fgets(txt2+1,Nmax,stdin);

		N = len(txt1);
		M = len(txt2);

		compute_dp(dp,txt1,txt2,N,M);
		compute_greedy(dp,txt1,txt2,N,M,K);
	}
}

int main()
{
	read_solve();
	return 0;
}