Cod sursa(job #134487)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 11 februarie 2008 19:49:54
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define PB push_back
#define ALL(X) (X).begin(), (X).end()

const int NMAX = 1024;
const int NLIT = 32;
const int Z = 'Z' - 'A';

int T, K, N, M, L, NR;
char S1[NMAX], S2[NMAX], R[NMAX];
int DP[NMAX][NMAX];
vector <int> P1[NLIT], P2[NLIT];

void dinamica(void) { 
	int i, j, p1, p2, lp1, lp2;

	N = strlen(S1+1);
	M = strlen(S2+1);
	L = min(N, M);

	for (i = 0; i <= Z; ++i)
		P1[i].clear(), P2[i].clear();

	for (i = 1; i <= N; ++i)
		P1[S1[i] - 'A'].PB(i);
	for (i = 1; i <= M; ++i)
		P2[S2[i] - 'A'].PB(i);

	memset(DP, 0x00, sizeof(DP));
	for (i = N; i > 0; --i)
		for (j = M; j >= 0; --j)
			if (S1[i] == S2[j]) {
				DP[i][j] = DP[i+1][j+1] + 1;
			} else {
				if (DP[i+1][j] > DP[i][j+1])
					DP[i][j] = DP[i+1][j];
				else
					DP[i][j] = DP[i][j+1];
			}
	
	lp1 = lp2 = 0; NR = 0;
	for (i = 1; i <= L; ++i) {
		for (j = Z; j >= 0; --j) {
			p1 = upper_bound(ALL(P1[j]), lp1) - P1[j].begin();
			p2 = upper_bound(ALL(P2[j]), lp2) - P2[j].begin();
			
			if (p1 >= (int)P1[j].size() || p2 >= (int)P2[j].size()) continue;
			p1 = P1[j][p1]; p2 = P2[j][p2];

			if (i + DP[p1+1][p2+1] >= K) {
				R[NR++] = 'A' + j;
				lp1 = p1;
				lp2 = p2;
				break;
			}
		}
		if (j < 0) break;
	}
}

int main(void) {
	freopen("seif.in", "rt", stdin);
	freopen("seif.out", "wt", stdout);

	scanf(" %d", &T);

	while (T--) {
		scanf(" %d", &K);
		scanf(" %s %s", S1+1, S2+1);

		dinamica();

		R[NR] = 0;
		printf("%s\n", R);
	}

	return 0;
}