Cod sursa(job #160491)

Utilizator sraduvictorSarmasag Radu Victor sraduvictor Data 15 martie 2008 22:12:49
Problema Lampa Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.07 kb
//In functie de N stiu daca primul in sir este primul cuvant sau al doilea
//N - par : al doilea
//N - impar : primul

//Calculez lungimile posibile ale lui a si b
//si verific toate posibilitatile

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <string>

using namespace std;

class Pair
{	
public:
	int a, b;
	string sir;
	Pair( int a, int b, const char sir[] )
	{
		this->a = a;
		this->b = b;
		this->sir = sir;
	}
};

class SPair
{
public:
	string a, b;
	SPair( string a, string b )
	{
		this->a = a;
		this->b = b;
	}
	bool operator < ( const SPair p ) const
	{
		//if ( a.substr( 0, p.a.size() ) == p.a )
		//	return 1;
		return strcmp( p.a.c_str(), (this->a).c_str() ) > 0;
		//return (this->a < p.a);
	}
};

int main( int argc, char *argv[] )
{
	int n, m;
	FILE *fin = fopen( "lampa.in", "r" );
	fscanf( fin, "%d %d", &n, &m );
	
	Pair t1( 1, 0, "a" );
	Pair t2( 0, 1, "b" );
	Pair t3( 1, 1, "ab" );
	
	for ( int i = 3; i < n; i++ )
	{
		t1.a = t2.a; t1.b = t2.b; t1.sir = t2.sir;
		t2.a = t3.a; t2.b = t3.b; t2.sir = t3.sir;
		t3.a = t1.a + t2.a;
		t3.b = t1.b + t2.b;
		t3.sir = t1.sir + t2.sir;
	}
	
	//fprintf( stdout, "%d %d %s\n", t3.a, t3.b, t3.sir.c_str() );
	
	vector<Pair> vec;
	vector<SPair> sol;
	int max = 0;
	
	for ( int i = 1; i < m/t3.a; i++ )
		if ( (m - (t3.a*i)) % t3.b == 0 )
		{
			vec.push_back( Pair( i, (m-(t3.a*i)) / t3.b, t3.sir.c_str() ) );
			int suma = 0;
			for ( int j = 0; j < 4; j++ )
				if ( t3.sir[j] == 'a' )
					suma += i;
				else
					suma += (m - (t3.a*i)) / t3.b ;
			if ( max < suma )
				max = suma;
			//fprintf( stdout, "%d %d | %d %d\n", i, (m-(t3.a*i)) / t3.b, suma, max );
		}
	
	char *sir = new char[max+2];
	memset( sir, 0, max+2 );
	fscanf( fin, "\n" );
	fread( sir, sizeof( char ), max, fin );
	
	//fprintf( stdout, "%s | %d\n", sir, strlen( sir ) );
	
	for ( int i = 0; i < vec.size(); i++ )
	{			
		int pasi[4];
		pasi[0] = 0;
		for ( int j = 0; j < 3; j++ )
			if ( vec[i].sir[j] == 'a' )
				pasi[j+1] = vec[i].a + pasi[j];
			else
				pasi[j+1] = vec[i].b + pasi[j];
		
			
		if ( vec[i].sir[0] == 'a' && vec[i].sir[2] == 'a' )
		{
			if ( memcmp( sir, sir+pasi[2], vec[i].a ) )
				continue;
		}
		else if ( vec[i].sir[0] == 'b' && vec[i].sir[2] == 'b' )
		{
			if ( memcmp( sir, sir+pasi[2], vec[i].b ) )
				continue;
		}
		else if ( vec[i].sir[1] == 'a' && vec[i].sir[2] == 'a' )
		{
			if ( memcmp( sir+pasi[1], sir+pasi[2], vec[i].a ) )
				continue;
		}
		else if ( vec[i].sir[1] == 'b' && vec[i].sir[2] == 'b' )
		{
			if ( memcmp( sir+pasi[1], sir+pasi[2], vec[i].b ) )
				continue;
		}
		
		if ( vec[i].sir[0] == 'a' && vec[i].sir[3] == 'a' )
		{
			if ( memcmp( sir, sir+pasi[3], vec[i].a ) )
				continue;
		}
		else if ( vec[i].sir[0] == 'b' && vec[i].sir[3] == 'b' )
		{
			if ( memcmp( sir, sir+pasi[3], vec[i].b ) )
				continue;
		}
		else if ( vec[i].sir[1] == 'a' && vec[i].sir[3] == 'a' )
		{
			if ( memcmp( sir+pasi[1], sir+pasi[3], vec[i].a ) )
				continue;
		}
		else if ( vec[i].sir[1] == 'b' && vec[i].sir[3] == 'b' )
		{
			if ( memcmp( sir+pasi[1], sir+pasi[3], vec[i].b ) )
				continue;
		}
		
		string el[3];
		int nrvechi = 0;
		for ( int j = 0; j < 2; j++ )
		{
			int nr = 0;
			el[j] = "";
			if ( vec[i].sir[j] == 'a' )
				nr = vec[i].a;
			else
				nr = vec[i].b;
			char ch = sir[nrvechi+nr];
			sir[nrvechi+nr] = 0;
			el[j] = sir+nrvechi;
			sir[nrvechi+nr] = ch;			
			nrvechi += nr;
		}
		
		//fprintf( stdout, "%s %s %s\n", el[0].c_str(), el[1].c_str(), el[2].c_str() );
		
		string a, b;
		if ( vec[i].sir[0] == 'a' )
			a = el[0];
		else
			b = el[0];
		if ( vec[i].sir[1] == 'a' )
			a = el[1];
		else
			b = el[1];
		
		sol.push_back( SPair( a, b ) );
	}
	//if ( sol.size() == 12 )
	//	return 0;
	sort( sol.begin(), sol.end() );
	
	FILE *fout = fopen( "lampa.out", "w" );
	if ( sol.size() == 0 )
		fprintf( fout, "0\n" );
	else
		fprintf( fout, "%s\n%s\n", sol[0].a.c_str(), sol[0].b.c_str() );
	fclose( fout );
	
	return 0;
}