Cod sursa(job #961241)

Utilizator primulDarie Sergiu primul Data 11 iunie 2013 20:04:39
Problema Lampa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 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];
    }
     
    int solutie = 0;
    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) ){
                solutie = 1;
                break ;
            }
        }
    }
     
    if ( solutie ){
        fprintf(g,"%s\n%s\n",sola.c_str(),solb.c_str());
    }
    else{
        fprintf(g,"0\n");
    }
     
    fclose(f);
    fclose(g);
     
    return 0;
}