Cod sursa(job #940839)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 17 aprilie 2013 10:59:35
Problema Lampa Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<stdio.h>
#include<string>

#define maxn 30

using namespace std;

FILE*f=fopen("lampa.in","r");
FILE*g=fopen("lampa.out","w");

int n,lung,starta,startb;
int a[maxn],b[maxn],l[100];
char sir[3100000];
string conf[maxn],sola,solb;

inline bool check ( const int &x , const int &y ){
	
	startb = lung-y+1;
	if ( n&1 )	starta = 1;
	else	starta = 1+y;
	l['a'] = x; l['b'] = y;
	
	int p = 0;
	for ( int i = 1 ; i <= lung ; ){
		
		char ch = conf[n][p];
		if ( ch == 'a' ){
			for ( int j = i ; j <= i+l[ch]-1 ; ++j ){
				if ( sir[j] != sir[starta+j-i] )	return 0;
			}
		}
		else{
			for ( int j = i ; j <= i+l[ch]-1 ; ++j ){
				if ( sir[j] != sir[startb+j-i] )	return 0;
			}
		}
		
		i += l[ch]; ++p;
	}
	
	sola.reserve(l['a']);
	for ( int i = 1 ; i <= l['a'] ; ++i ){
		sola.push_back(sir[starta+i-1]);
	}
	solb.reserve(l['b']);
	for ( int i = 1 ; i <= l['b'] ; ++i ){
		solb.push_back(sir[startb+i-1]);
	}
	
	return 1;
}

int main () {
	
	fscanf(f,"%d %d\n",&n,&lung);
	fscanf(f,"%s",sir+1);
	
	a[1] = b[2] = 1; conf[1] = "a"; conf[2] = "b";
    for ( int i = 3 ; i <= 25 ; ++i ){
		a[i] = a[i-1]+a[i-2];
		b[i] = b[i-1]+b[i-2];
		conf[i] = conf[i-2] + conf[i-1];
    }
    
    for ( int x = 1 ; a[n]*x <= lung ; ++x ){
		if ( !((lung-a[n]*x)%b[n]) ){
			int y = (lung-a[n]*x)/b[n];
			
			if ( check(x,y) ){
				break ;
			}
		}
    }
    
    fprintf(g,"%s\n%s\n",sola.c_str(),solb.c_str());
	
	fclose(f);
	fclose(g);
	
	return 0;
}