Cod sursa(job #184731)

Utilizator marinaMarina Horlescu marina Data 24 aprilie 2008 10:18:53
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
//Seif - Stelele informaticii 2008 Clasele 11-12
#include <stdio.h>
#include <string.h>
#define INPUT "seif.in"
#define OUTPUT "seif.out"
#define NMAX 1024
#define SIGMA 32

int T, K;
char A[NMAX], B[NMAX];

//NextA[i][j] - primul index k din i,i+1,..N-1 a.i. A[k] = j+'A'
int NextA[NMAX][SIGMA], NextB[NMAX][SIGMA];

//C[i][j] - lung cmmsc A[i,i+1...N-1] si B[j,j+1,...M-1]
int C[NMAX][NMAX];

inline int max(int A, int B) { return A>B?A:B;}
int main()
{
	freopen(INPUT, "r", stdin);
	freopen(OUTPUT, "w", stdout);
	
	for(scanf("%d", &T); T; --T)
	{
		scanf("%d", &K);
		scanf("%s\n", A);
		scanf("%s\n", B);
		
		int N = strlen(A);
		int M = strlen(B);
		
		int i, j;
		
		memset(NextA, -1, sizeof(NextA));
		memset(NextB, -1, sizeof(NextB));
		
		for(i = N-1; i >= 0; --i)
			for(j = 0; j < 26; ++j)				NextA[i][j] = A[i] == j+'A'? i:NextA[i+1][j];
		
		for(i = M-1; i >= 0; --i)
			for(j = 0; j < 26; ++j)				NextB[i][j] = B[i] == j+'A'? i:NextB[i+1][j];
		
		memset(C, 0, sizeof(C));
		for(i = N-1; i >= 0; --i)
			for(j = M-1; j >= 0; --j)				C[i][j] = A[i]==B[j] ? C[i+1][j+1]+1 : max(C[i+1][j], C[i][j+1]);
		
		int ok = 1, lit; i = 0, j = 0;
		while(ok)
		{
			ok = 0;
			for(lit = 25; lit>=0 && !ok; --lit)
				if(NextA[i][lit] != -1 && NextB[j][lit] != -1)
				{
					if(C[NextA[i][lit]][NextB[j][lit]] < K) continue;
				
					printf("%c", lit+'A');
					i = NextA[i][lit] + 1;
					j = NextB[j][lit] + 1;
					ok = 1;
				}
			--K;
		}
		printf("\n");
	}
	return 0;
}