Cod sursa(job #135647)

Utilizator dominoMircea Pasoi domino Data 14 februarie 2008 02:07:39
Problema Lampa Scor Ascuns
Compilator cpp Status done
Runda Marime 1.31 kb
#include <stdio.h>
#include <string>

using namespace std;

#define FIN "lampa.in"
#define FOUT "lampa.out"
#define MAX_N 20
#define MAX_S 4000000
#define sz(x) ((int)(x).size())

int N, M; char s[MAX_S];
string S, F[MAX_N], bstA, bstB;

int works(string a, string b)
{
    int i, p = 0;

    for (i = 0; i < sz(F[N]); ++i)
        if (F[N][i] == 'A')
        {
            if (S.substr(p, sz(a)) != a)
                return 0;
            p += sz(a);
        } 
        else 
        {
            if (S.substr(p, sz(b)) != b)
                return 0;
            p += sz(b);
        }
    return 1;

}

int main(void)
{
    int i, j, a, b;
    string A, B;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d %s", &N, &M, s);
    S = s;

    F[1] = "A"; F[2] = "B";
    for (i = 3; i <= N; ++i)
        F[i] = F[i-2]+F[i-1];
    a = sz(F[N-2]); b = sz(F[N-1]);

    for (i = 1; i*a <= M; ++i)
    {
        j = M-i*a;
        if (j%b) continue;
        j /= b;
        A = N&1 ? S.substr(0, i) : S.substr(j, i);
        B = N&1 ? S.substr(i, j) : S.substr(0, j);
        if (!works(A, B)) continue;
        if (bstA == "" || bstA > A)
            bstA = A, bstB = B;
    }
    printf("%s\n%s\n", bstA.c_str(), bstB.c_str());

    return 0;
}