Cod sursa(job #1559655)

Utilizator borcanirobertBorcani Robert borcanirobert Data 31 decembrie 2015 13:30:39
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

ifstream fin("seif.in");
ofstream fout("seif.out");

const int MAXNM = 1055;
const int MAXC = 26;
char a[MAXNM], b[MAXNM];
int urma[MAXC][MAXNM], urmb[MAXC][MAXNM];
int cmlsc[MAXNM][MAXNM];
int N, M, T, K;

void Solve();

int main()
{
	fin >> T;
	for ( ; T > 0; T-- )
	{
		fin >> K; fin.get();
		fin.getline(a + 1, MAXNM);
		fin.getline(b + 1, MAXNM);
		N = strlen(a + 1);
		M = strlen(b + 1);
		
		Solve();
	}
	
	fin.close();
	fout.close();
	return 0;
}

void Solve()
{
	int i, j, k;
	bool ok;
	
	for ( i = 0; i < MAXC; i++ )
		urma[i][N + 1] = urmb[i][M + 1] = 0;
	
	for ( i = N; i >= 1; i-- )
		for ( j = M; j >= 1; j-- )
		{
			cmlsc[i][j] = max( cmlsc[i + 1][j], cmlsc[i][j + 1] );
			
			if ( a[i] == b[j] )
				cmlsc[i][j] = max( cmlsc[i][j], cmlsc[i + 1][j + 1] + 1 );
		}
	
	for ( i = MAXC - 1; i >= 0; i-- )
	{
		for ( j = N; j >= 0; j-- )
		{
			if ( a[j + 1] - 'A' != i )
				urma[i][j] = urma[i][j + 1];
			else
				urma[i][j] = j + 1;
		}
	}
	
	for ( i = MAXC - 1; i >= 0; i-- )
	{
		for ( j = M; j >= 0; j-- )
		{
			if ( b[j + 1] - 'A' != i )
				urmb[i][j] = urmb[i][j + 1];
			else
				urmb[i][j] = j + 1;
		}
	}
	
	i = j = 0;
	//cout << cmlsc[urma[k][i]][urmb[k][j]] << ' ' << urma[k][i] << ' ' << urmb[k][j]; cin.get();
	while (1)
	{
		ok = false;
		for ( k = MAXC - 1; k >= 0; k-- )
			if ( cmlsc[urma[k][i]][urmb[k][j]] >= K && cmlsc[urma[k][i]][urmb[k][j]] > 0 )
			{
				ok = true;
				K--;
				fout << (char)( 'A' + k );
				i = urma[k][i];
				j = urmb[k][j];
				break;
			}
		
		if ( !ok )
			break;
	}
	fout << '\n';
}