#include <iostream> #include <cstdio> #include <string> #include <bitset> #include <cassert> using namespace std; constexpr auto MAX_LEN = 100000; int n; char input[8*MAX_LEN + 1000]; char result[10000]; int result_iter = 0; void append(char c) { result[result_iter++] = c; } int main() { scanf("%d", &n); scanf("%s", input); int bits_zero = 0; int bits_one = 0; for (int i = 0; i < 8 * n; ++i) { if (input[i] == '0') { bits_zero++; } else if (input[i] == '1') { bits_one++; } else { exit(1); } } // for (int _bits_zero = 0; _bits_zero < 3000; ++_bits_zero) { // for (int _bits_one = 0; _bits_one < 3000; ++_bits_one) { // if ((_bits_zero + _bits_one) % 8 != 0) { // continue; // } // n = (_bits_zero + _bits_one)/8; // bits_one = _bits_one; // bits_zero = _bits_zero; result_iter = 0; // printf("bits: 0:%d 1:%d\n", bits_zero, bits_one); // first 3 bits per word are constant - 011 bits_zero -= n; bits_one -= 2 * n; // at least one bit per word is one bits_one -= n; // printf("bits: 0:%d 1:%d\n", bits_zero, bits_one); // largest number of 'ones' - 6, letter 'o' // smallest number of 'ones' - 3, letter 'a' // without previously cut bits: // 'o' - 3ones, 1zeros // 'g' - 2ones, 2zeros // 'c' - 1ones, 3zeros // 'a' - 0ones, 4zeros while (bits_one <= bits_zero - 4 && bits_zero >= 0 && bits_one >= 0) { append('a'); bits_one -= 0; bits_zero -= 4; } while (bits_one < bits_zero && bits_zero >= 0 && bits_one >= 0) { append('c'); bits_one -= 1; bits_zero -= 3; } while (bits_one > bits_zero && bits_zero >= 0 && bits_one >= 0) { append('o'); bits_one -= 3; bits_zero -= 1; } if (bits_one >= 0 && bits_one == bits_zero && bits_one % 2 == 0) { for (int i = 0; i < bits_one / 2; ++i) { append('g'); } append('\0'); printf("%s\n", result); // std::string s(result); // int c_ones = 0; // int c_zeros = 0; // // cout << "out: "<< s << endl; // for (std::size_t i = 0; i < s.size(); ++i) // { // auto bits = bitset<8>(s.c_str()[i]); // // cout << "bits: " << bits << endl; // c_ones += bits.count(); // c_zeros += 8 - bits.count(); // } // if (c_ones != _bits_one || c_zeros != _bits_zero) { // printf("bits: 0:%d 1:%d\n", _bits_zero, _bits_one); // printf("%d != %d %d != %d\n", _bits_zero, c_zeros, _bits_one, c_ones); // } // assert(c_ones == _bits_one); // assert(c_zeros == _bits_zero); } else { printf("NIE\n"); } // printf("\n"); // } // } 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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include <iostream> #include <cstdio> #include <string> #include <bitset> #include <cassert> using namespace std; constexpr auto MAX_LEN = 100000; int n; char input[8*MAX_LEN + 1000]; char result[10000]; int result_iter = 0; void append(char c) { result[result_iter++] = c; } int main() { scanf("%d", &n); scanf("%s", input); int bits_zero = 0; int bits_one = 0; for (int i = 0; i < 8 * n; ++i) { if (input[i] == '0') { bits_zero++; } else if (input[i] == '1') { bits_one++; } else { exit(1); } } // for (int _bits_zero = 0; _bits_zero < 3000; ++_bits_zero) { // for (int _bits_one = 0; _bits_one < 3000; ++_bits_one) { // if ((_bits_zero + _bits_one) % 8 != 0) { // continue; // } // n = (_bits_zero + _bits_one)/8; // bits_one = _bits_one; // bits_zero = _bits_zero; result_iter = 0; // printf("bits: 0:%d 1:%d\n", bits_zero, bits_one); // first 3 bits per word are constant - 011 bits_zero -= n; bits_one -= 2 * n; // at least one bit per word is one bits_one -= n; // printf("bits: 0:%d 1:%d\n", bits_zero, bits_one); // largest number of 'ones' - 6, letter 'o' // smallest number of 'ones' - 3, letter 'a' // without previously cut bits: // 'o' - 3ones, 1zeros // 'g' - 2ones, 2zeros // 'c' - 1ones, 3zeros // 'a' - 0ones, 4zeros while (bits_one <= bits_zero - 4 && bits_zero >= 0 && bits_one >= 0) { append('a'); bits_one -= 0; bits_zero -= 4; } while (bits_one < bits_zero && bits_zero >= 0 && bits_one >= 0) { append('c'); bits_one -= 1; bits_zero -= 3; } while (bits_one > bits_zero && bits_zero >= 0 && bits_one >= 0) { append('o'); bits_one -= 3; bits_zero -= 1; } if (bits_one >= 0 && bits_one == bits_zero && bits_one % 2 == 0) { for (int i = 0; i < bits_one / 2; ++i) { append('g'); } append('\0'); printf("%s\n", result); // std::string s(result); // int c_ones = 0; // int c_zeros = 0; // // cout << "out: "<< s << endl; // for (std::size_t i = 0; i < s.size(); ++i) // { // auto bits = bitset<8>(s.c_str()[i]); // // cout << "bits: " << bits << endl; // c_ones += bits.count(); // c_zeros += 8 - bits.count(); // } // if (c_ones != _bits_one || c_zeros != _bits_zero) { // printf("bits: 0:%d 1:%d\n", _bits_zero, _bits_one); // printf("%d != %d %d != %d\n", _bits_zero, c_zeros, _bits_one, c_ones); // } // assert(c_ones == _bits_one); // assert(c_zeros == _bits_zero); } else { printf("NIE\n"); } // printf("\n"); // } // } return 0; } |