Cod sursa(job #2091853)

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

int main()
{
    assert(freopen(in, "r", stdin));
    assert(freopen(out,"w", stdout));
    assert(scanf("%d%d%s", &N, &M, S));
    ord[1][0] = 'a', ord[0][0] = 'b';
    int a = 0, b = 1, c = 1;
    for(int i = 3, poz = i&1; i <= N; ++i, poz = 1-poz)
    {
        a = b, b = c, c = a + b;
        strcat(ord[poz], ord[1-poz]);
    }
    int Acf = a, Bcf = b;
    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; ++i)
            {
                if(ord[N&1][i] == 'a')
                {
                    for(int j = 0; j < asize; ++j)
                        if(S[stick+j] != S[j])
                            { ok = 0; break; }
                    stick += asize;
                }
                else
                {
                    for(int j = 0; j < bsize; ++j)
                        if(S[stick+j] != S[asize+j])
                            { ok = 0; break; }
                    stick += bsize;
                }
            }
            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]));
                return 0;
            }

        }
        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; break; }
                    stick += bsize;
                }
                else
                {
                    for(int j = 0; j < asize; ++j)
                        if(S[stick+j] != S[bsize+j])
                            { ok = 0; break; }
                    stick += asize;
                }
            }
            if(ok)
            {
                for(int i = 0; i < bsize; ++i)
                    assert(printf("%c", S[i]));
                assert(printf("\n"));
                for(int i = bsize; i < asize+bsize; ++i)
                    assert(printf("%c", S[i]));
                return 0;
            }

        }
    }
    assert(printf("0\n"));
    fclose(stdin), fclose(stdout);
    return 0;
}