Cod sursa(job #143691)

Utilizator filipbFilip Cristian Buruiana filipb Data 26 februarie 2008 19:42:57
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <string.h>

#define maxim(a, b) ((a > b) ? a : b)
#define INF 32000
#define NMax 1024

int M, N, K;
short int D[NMax][NMax], fA[26][NMax], fB[26][NMax];
char A[NMax], B[NMax], sol[NMax]; int cnt;

int main(void)
{
	int T, i, j, c;
	
	freopen("seif.in", "r", stdin);
	freopen("seif.out", "w", stdout);

	for (scanf("%d", &T); T; T--)
	{
		scanf("%d %s %s", &K, A, B);
		for (M = 0; A[M] >= 'A' && A[M] <= 'Z'; ++M);
		for (N = 0; B[N] >= 'A' && B[N] <= 'Z'; ++N);
		
		for (i = M; i; --i) A[i] = A[i-1]; A[0] = ' ';
		for (i = N; i; --i) B[i] = B[i-1]; B[0] = ' ';
		
		for (i = 0; i <= N+1; ++i)
			D[M+1][i] = 0;
		for (i = 0; i <= M+1; ++i)
			D[i][N+1] = 0;
		for (i = M; i; --i)
			for (j = N; j; --j)
				if (A[i] == B[j])
					D[i][j] = 1 + D[i+1][j+1];
				else
					D[i][j] = maxim(D[i+1][j], D[i][j+1]);

		for (c = 0; c < 26; ++c)
			for (i = M, fA[c][M+1] = INF; i; --i)		
				if (A[i] == c + 'A')
					fA[c][i] = i;
				else
					fA[c][i] = fA[c][i+1];
		
		for (c = 0; c < 26; ++c)
			for (i = N, fB[c][N+1] = INF; i; --i)		
				if (B[i] == c + 'A')
					fB[c][i] = i;
				else
					fB[c][i] = fB[c][i+1];

		for (i = j = cnt = 0, c = 25; c >= 0; )
			for (c = 25; c >= 0; --c)
				if (fA[c][i+1] <= M && fB[c][j+1] <= N && D[fA[c][i+1]][fB[c][j+1]] >= K - cnt)
				{
					i = fA[c][i+1];
					j = fB[c][j+1];
					sol[cnt++] = 'A' + c; 
					break;					
				}
		
		for (i = 0; i < cnt; ++i)
			printf("%c", sol[i]);
		printf("\n");
	}
	
	return 0;
}