1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <map>
#include <vector>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    string data;
    getline(cin, data); // koniec pierwszej linii
    getline(cin, data);

    /** Liczba bitów */
    const int total = n * 8;

    /** Liczba jedynek */
    int ones = 0;
    for (auto i = 0; i < data.size(); ++i) if (data[i] == '1') ++ones;
    /** Liczba zer */
    const int zeros=total-ones;

    // Możliwe bajty w kontekście różnicy liczby zer i jedynek i przykładowe dla nich litery
    // a: 3/5
    // c: 4/4
    // g: 5/3
    // o: 6/2

    // Warunki brzegowe:
    // - każdy znak ma minimum 3 jedynki,
    // - każdy znak ma minimum 2 zera
    if( (ones<n*3) || (zeros<n*2)) {
        cout << "NIE" << endl;
        return 0;
    }

    /** Czy nieparzysta liczba jedynek */
    const bool odd=(ones&1)!=0;

    // Iterujemy po opcjach dla litery 'a'
    for (int a = 0; a <= n; ++a) {
        const int restA = n - a;
        // Iterujemy po opcjach dla litery g
        for (int g = odd?(1-(a&1)):(a&1) ; g <= restA; g+=2) {
            // Wartości dla A i G są stałe, ze względu na powyższe iteracje
            // 1. 3A + 4c + 5G + 6o = #1  - liczba 1
            // 2. 5A + 4c + 3G + 2o = #0  - liczba 0

            // 2. 2o = #0 - 5A - 4c - 3G

            // 1. 3A + 4c + 5G + 3* (#0 - 5A - 4c - 3G) = #1
            // 1. 3A + 4c + 5G + 3*#0 - 15A - 12c - 9G = #1
            // 1. -12A - 8c - 4G + 3*#0 = #1
            // 1. -8c = #1 - 3*#0 + 12A + 4G

            // 1. c = (3*#0 - #1 - 12A - 4g)/8
            // 2. o = (#0 - 5A - 4C - 3g)/2

            int c=3*zeros - ones - 12*a - 4*g;
            if(c< 0 ||  ((c&7)!=0) ) continue;  // niepodzielne przez 8
            c>>=3;

            int o=zeros - 5*a - 4*c - 3*g;
            if(o<0 || ((o&1)!=0) ) continue;  // niepodzielne przez 2;
            o>>=1;

            if((a+c+g+o)!=n) continue;
            if((3*a + 4*c + 5*g + 6*o)!=ones) continue;
            if((5*a + 4*c + 3*g + 2*o)!=zeros) continue;

            for (int i = 0; i < o; ++i) cout << 'o';
            for (int i = 0; i < g; ++i) cout << 'g';
            for (int i = 0; i < c; ++i) cout << 'c';
            for (int i = 0; i < a; ++i) cout << 'a';
            cout << endl;
            return 0;
        }
    }

    cout << "NIE" << endl;
    return 0;
}