Cod sursa(job #2003185)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 22 iulie 2017 10:00:52
Problema Lampa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>
using namespace std;

ifstream in ("lampa.in" );
ofstream out("lampa.out");

int dp[3][26];
string str, x, y, z;

bool solve(int l1, int l2, int n)
{
    int p = 0, p1, p2;

    if (n & 1)
        p1 = 0, p2 = l1;
    else
        p1 = l2, p2 = 0;
    
    for (char ch : y) {
        if (ch == '1') {
            if (str.compare(p, l1, str, p1, l1))
                return false;
            else
                p += l1;
        } else {
            if (str.compare(p, l2, str, p2, l2))
                return false;
            else
                p += l2;
        }
    }

    return true;
}

int main(void)
{
    int n, m;
    in >> n >> m >> str;
    
    dp[1][1] = dp[2][2] = 1;
    for (int i = 3; i <= n; ++i) {
        dp[1][i] = dp[1][i - 2] + dp[1][i - 1];
        dp[2][i] = dp[2][i - 2] + dp[2][i - 1];
        
        if (dp[1][i] + dp[2][i] > str.length()) {
            out << 0;
            return 0;
        }
    }
    
    x = '1'; y = '2';
    for (int i = 3; i <= n; ++i) {
        z = x + y;
        x = y; y = z;
    }
    
    for (int l2 = (int) str.length() / dp[2][n]; l2; --l2) {
        int l1 = (int) (str.length() - dp[2][n] * l2) / dp[1][n];
        
        if (l1 * dp[1][n] + l2 * dp[2][n] == str.length() && solve(l1, l2, n)) {
            if (n & 1)
                out << str.substr(0, l1) << "\n" << str.substr(l1, l2);
            else
                out << str.substr(l2, l1) << "\n" << str.substr(0, l2);
            return 0;
        }
    }
    
    out << 0;
    return 0;
}