Cod sursa(job #461463)

Utilizator SpiderManSimoiu Robert SpiderMan Data 6 iunie 2010 21:55:51
Problema Lampa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <cstdio>

const char FIN[] = "lampa.in", FOU[] = "lampa.out";
const int MAX = 30000;

int fib[28], N, M;
char sirD[MAX * 101], aux[MAX * 7];
char sirI1[MAX], sirI2[MAX];

void prec ()
{
    fib[1] = fib[2] = 1;

    for ( int i = 3; i <= N; ++i) fib[i] = fib[i - 2] + fib[i - 1] ;

    aux[ fib[N] - 1 ] = '1', aux[ fib[N] ] = '2';

    for ( int i = 4; i <= N; ++i)
        for ( int j = fib[N] - fib[i] + 1; j <= fib[N] - fib[i - 1]; ++j)
            aux[j] = aux[ j + fib[i - 1] ];

}

int verif (int length1, int length2)
{
    if ( N & 1 )
        for (int i = 1; i <= length1 || i <= length2 ; ++i) ( i <= length1 ? sirI1[i] = sirD[i] : 0 ), ( i <= length2 ? sirI2[i] = sirD[ i + length1 ] : 0 );
    else
        for (int i = 1; i <= length1 || i <= length2 ; ++i) ( i <= length1 ? sirI1[i] = sirD[ i + length2 ] : 0 ), ( i <= length2 ? sirI2[i] = sirD[i] : 0 );

    for (int i = 1, j = 0; i <= fib[N]; ++i)
    {
        int ln = 1 ;
        if ( aux[i] == '1' )
            for ( ; ln <= length1 ; ++ln)
                if ( sirI1[ ln ] != sirD[ j + ln ] ) return 0;

        if ( aux[i] == '2' )
            for ( ; ln <= length2 ; ++ln)
                if ( sirI2[ ln ] != sirD[ j + ln ] ) return 0;

        j += ln - 1;
    }

    sirI1[ length1 + 1 ] = 0, sirI2[ length2 + 1 ] = 0;

    printf ( "%s\n%s", sirI1 + 1 , sirI2 + 1 ) ;

    return 1;
}


int main ()
{
    freopen (FIN , "r" , stdin);
    freopen (FOU , "w" , stdout);

    scanf ("%d %d\n", &N, &M);
    fgets( sirD + 1, MAX * 101, stdin);

    prec () ;

    for (int i = 1; i <= M; ++i)
        if ( M - i * fib[ N - 2 ] <= 0 ) break;
        else if ( ( M - i * fib[ N - 2 ] ) % fib[ N - 1 ] == 0 )
            if ( verif ( i , ( M - i * fib[ N - 2 ] ) / fib[ N - 1 ] ) )
                return 0;


    printf ("0");

    return 0;
}