Cod sursa(job #320860)

Utilizator Mishu91Andrei Misarca Mishu91 Data 6 iunie 2009 00:15:09
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <cstring>

#define MAX_N 1005
#define SG 26

int N, M, K, T;
char A[MAX_N], B[MAX_N];
int PA[MAX_N][SG], PB[MAX_N][SG];
int L[MAX_N][MAX_N];

inline int Max(const int &A, const int &B)
{
	return ((A) > (B))? (A) : (B);
}

void solve()
{
	scanf("%d\n%s\n%s",&K, A+1, B+1);
	N = strlen(A+1);
	M = strlen(B+1);
	
	memset(L, 0, sizeof L);
	for(int i = N; i; --i)
		for(int j = M; j; --j)
			L[i][j] = (A[i] == B[j])? (L[i+1][j+1] + 1) : Max(L[i+1][j], L[i][j+1]);
	
	memset(PA, -1, sizeof PA);
	for(int i = N; i; --i)
		for(int c = 0; c < SG; ++c)
			if(A[i] == (c + 'A')) 
				PA[i][c] = i;
			else
				PA[i][c] = PA[i+1][c];
	
	memset(PB, -1, sizeof PB);
	for(int i = M; i; --i)
		for(int c = 0; c < SG; ++c)
			if(B[i] == (c + 'A')) 
				PB[i][c] = i;
			else
				PB[i][c] = PB[i+1][c];
			
	int i(1), j(1), ok(1);
	
	while(ok)
	{
		ok = 0;
		for(int c = 25; (c >= 0) && (!ok); --c)
			if((PA[i][c] != -1) && (PB[j][c] != -1) && (L[PA[i][c]][PB[i][c]] >= K))
			{
				printf("%c",c + 'A');
				ok = 1;
				i = PA[i][c] + 1;
				j = PB[j][c] + 1;
			}
		--K;
	}
	printf("\n");
}

int main()
{
	freopen("seif.in","rt",stdin);
	freopen("seif.out","wt",stdout);
	
	scanf("%d",&T);
	while(T--)
		solve();
}