Cod sursa(job #139047)

Utilizator filipbFilip Cristian Buruiana filipb Data 19 februarie 2008 17:45:51
Problema Lampa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <stdio.h>

#define NMax 3200005

int N, M, fib[32], wh;
char S[NMax], D[2][131072];

int check(int lA, int lB)
{
    int i, ind = 0, cuv = 0, start[2], fin[2];

    if (N % 2)
        start[0] = 0, start[1] = lA, fin[0] = lA, fin[1] = lA+lB;
    else
        start[0] = lB, start[1] = 0, fin[0] = lB, fin[1] = lA+lB;
        
    for (i = 0; i < M; ++i, ++ind)
    {
        if (ind == fin[0] || ind == fin[1])
            ind = start[D[wh][++cuv]-'A'];
            
        if (S[ind] != S[i])
            return 0;
    }
    return 1;
}

int main(void)
{
    int i, j, k, crt = 0, prev = 1;
    
    freopen("lampa.in", "r", stdin);
    freopen("lampa.out", "w", stdout);

    scanf("%d %d\n", &N, &M);
    fgets(S, sizeof(S), stdin);

    D[0][0] = 'A'; D[1][0] = 'B';
    fib[0] = fib[1] = 1;
    for (i = 2; i < N; i++)
    {
        crt = (i & 1); prev = (!crt);
        fib[i] = fib[i-1] + fib[i-2];
        for (j = 0; j < fib[i-1]; j++)
            D[crt][fib[i-2]+j] = D[prev][j];
    }
    wh = crt;

    for (i = 1; i * fib[N-3] < M; i++)
    {
        if ((M - i * fib[N-3]) % fib[N-2]) continue;
        j = (M - i * fib[N-3]) / fib[N-2];
        if (check(i, j))
            break;
    }

    if (i * fib[N-3] >= M)
    {
        printf("0\n");
        return 0;
    }
    
    if (N % 2)
    {
        for (k = 0; k < i; k++)
            printf("%c", S[k]);
        printf("\n");
        for (k = i; k < i+j; k++)
            printf("%c", S[k]);
        printf("\n");
    }
    else
    {
        for (k = j; k < i+j; k++)
            printf("%c", S[k]);
        printf("\n");
        for (k = 0; k < j; k++)
            printf("%c", S[k]);
        printf("\n");        
    }

    return 0;
}