#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; }
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; } |