Cod sursa(job #2091842)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 20 decembrie 2017 12:53:26
Problema Lampa Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <bits/stdc++.h>
#define in "lampa.in"
#define out "lampa.out"
#define MN 32
using namespace std;
int N, M, CF[MN];
deque < pair < int, int > > psbl;
char S[3027200], ord[2][130000];

int main()
{
    assert(freopen(in, "r", stdin));
    assert(freopen(out,"w", stdout));
    assert(scanf("%d%d%s", &N, &M, S));
    CF[1] = CF[2] = 1; ord[1][0] = 'a', ord[0][0] = 'b';
    for(int i = 3, poz = i&1; i <= N; ++i, poz = 1-poz)
    {
        CF[i] = CF[i-2] + CF[i-1];
        strcat(ord[poz], ord[1-poz]);
    }
    int Acf = CF[N-2], Bcf = CF[N-1];
    if(N&1)
        for(int i = 1; i*Acf <= M; ++i)
            if((M-Acf*i) % Bcf == 0)
                psbl.push_back(make_pair(i, (M-Acf*i)/Bcf));
    else
        for(int i = 1; i*Bcf <= M; ++i)
            if((M-Bcf*i) % Acf == 0)
                psbl.push_back(make_pair(i, (M-Bcf*i)/Acf));
    while(!psbl.empty())
    {
        int asize = psbl.front().first,
            bsize = psbl.front().second,
            stick = 0;
        psbl.pop_front();
        bool ok = 1;
        if(N&1)
        {
            for(int i = 0; i < Acf+Bcf && ok; ++i)
            {
                if(ord[N&1][i] == 'a')
                {
                    for(int j = 0; j < asize; ++j)
                        if(S[stick+j] != S[j])
                            ok = 0;
                    stick += asize;
                }
                else
                {
                    for(int j = 0; j < bsize; ++j)
                        if(S[stick+j] != S[asize+j])
                            ok = 0;
                    stick += bsize;
                }
            }
        }
        else
        {
            for(int i = 0; i < Acf+Bcf && ok; ++i)
            {
                if(ord[N&1][i] == 'b')
                {
                    for(int j = 0; j < bsize; ++j)
                        if(S[stick+j] != S[j])
                            ok = 0;
                    stick += bsize;
                }
                else
                {
                    for(int j = 0; j < asize; ++j)
                        if(S[stick+j] != S[bsize+j])
                            ok = 0;
                    stick += asize;
                }
            }
        }
        if(ok)
        {
            for(int i = 0; i < asize; ++i)
                assert(printf("%c", S[i]));
            assert(printf("\n"));
            for(int i = asize; i < asize+bsize; ++i)
                assert(printf("%c", S[i]));
            while(!psbl.empty()) psbl.pop_back();
        }
    }
    fclose(stdin), fclose(stdout);
    return 0;
}