Cod sursa(job #134296)

Utilizator wefgefAndrei Grigorean wefgef Data 11 februarie 2008 10:57:08
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <cstring>

const int Nmax = 1024;
const int Sigma = 32;

int N, M, K;
char A[Nmax], B[Nmax];
int C[Nmax][Nmax];
int NextA[Nmax][Sigma], NextB[Nmax][Sigma];

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

int main() {
	freopen("seif.in", "r", stdin);
	freopen("seif.out", "w", stdout);
	
	int T;
	for (scanf("%d", &T); T; --T) {
		scanf("%d", &K);
		scanf("%s", A); N = strlen(A);
		scanf("%s", B); M = strlen(B);
		
		memset(NextA, -1, sizeof(NextA));
		memset(NextB, -1, sizeof(NextB));
		
		for (int i = N-1; i >= 0; --i)
			for (int j = 0; j < 26; ++j)
				if (A[i] == j+'A') NextA[i][j] = i;
				else NextA[i][j] = NextA[i+1][j];
		
		for (int i = M-1; i >= 0; --i)
			for (int j = 0; j < 26; ++j)
				if (B[i] == j+'A') NextB[i][j] = i;
				else NextB[i][j] = NextB[i+1][j];
				
		memset(C, 0, sizeof(C));
		for (int i = N-1; i >= 0; --i)
			for (int j = M-1; j >= 0; --j)
				C[i][j] = A[i] == B[j] ? 1 + C[i+1][j+1] : max(C[i+1][j], C[i][j+1]);
				
		int i = 0, j = 0, next_let;
		while (1) {
			char found = 0;
			for (next_let = 25; next_let >= 0; --next_let)
				if (NextA[i][next_let] != -1 && NextB[j][next_let] != -1) {
					if (C[NextA[i][next_let]][NextB[j][next_let]] < K) continue;
					
					printf("%c", next_let+'A');
					i = NextA[i][next_let]+1, j = NextB[j][next_let]+1;
					
					found = 1;
					break;
				}
			if (!found) break;
			--K;
		}	
		printf("\n");
	}
}