#include <iostream> #include <optional> #include <string> #include <vector> void solve_dataset(); std::vector<int> get_bit_counts(std::istream& stream); std::optional<std::string> recovered_text(std::vector<int> bit_counts); int main() { std::ios_base::sync_with_stdio(false); solve_dataset(); return 0; } void solve_dataset() { int _letter_count; std::cin >> _letter_count; const auto bit_counts = get_bit_counts(std::cin); const auto text = recovered_text(bit_counts); if(text.has_value()) std::cout << text.value(); else std::cout << "NIE"; std::cout << std::endl; } std::vector<int> get_bit_counts(std::istream& stream) { std::vector<int> counts(2, 0); std::string bits; stream >> bits; for(const char bit : bits) counts[bit - '0']++; return counts; } std::optional<std::string> recovered_text(std::vector<int> bit_counts) { const int total_bits = bit_counts[0] + bit_counts[1]; const int message_length = total_bits / 8; bit_counts[0] -= message_length; bit_counts[1] -= 2 * message_length; if(bit_counts[0] < 0 || bit_counts[1] < 0) return std::nullopt; if(bit_counts[1] > 4 * bit_counts[0] || bit_counts[0] > 4 * bit_counts[1]) return std::nullopt; std::string message; message.reserve(message_length); for(int _ = 0; _ < message_length; _++) { if(2 * bit_counts[0] > 3 * bit_counts[1]) { bit_counts[0] -= 4; bit_counts[1] -= 1; message.push_back('a'); } else if(bit_counts[0] > bit_counts[1]) { bit_counts[0] -= 3; bit_counts[1] -= 2; message.push_back('c'); } else if(2 * bit_counts[1] > 3 * bit_counts[0]) { bit_counts[0] -= 1; bit_counts[1] -= 4; message.push_back('o'); } else { bit_counts[0] -= 2; bit_counts[1] -= 3; message.push_back('g'); } } return message; }
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 | #include <iostream> #include <optional> #include <string> #include <vector> void solve_dataset(); std::vector<int> get_bit_counts(std::istream& stream); std::optional<std::string> recovered_text(std::vector<int> bit_counts); int main() { std::ios_base::sync_with_stdio(false); solve_dataset(); return 0; } void solve_dataset() { int _letter_count; std::cin >> _letter_count; const auto bit_counts = get_bit_counts(std::cin); const auto text = recovered_text(bit_counts); if(text.has_value()) std::cout << text.value(); else std::cout << "NIE"; std::cout << std::endl; } std::vector<int> get_bit_counts(std::istream& stream) { std::vector<int> counts(2, 0); std::string bits; stream >> bits; for(const char bit : bits) counts[bit - '0']++; return counts; } std::optional<std::string> recovered_text(std::vector<int> bit_counts) { const int total_bits = bit_counts[0] + bit_counts[1]; const int message_length = total_bits / 8; bit_counts[0] -= message_length; bit_counts[1] -= 2 * message_length; if(bit_counts[0] < 0 || bit_counts[1] < 0) return std::nullopt; if(bit_counts[1] > 4 * bit_counts[0] || bit_counts[0] > 4 * bit_counts[1]) return std::nullopt; std::string message; message.reserve(message_length); for(int _ = 0; _ < message_length; _++) { if(2 * bit_counts[0] > 3 * bit_counts[1]) { bit_counts[0] -= 4; bit_counts[1] -= 1; message.push_back('a'); } else if(bit_counts[0] > bit_counts[1]) { bit_counts[0] -= 3; bit_counts[1] -= 2; message.push_back('c'); } else if(2 * bit_counts[1] > 3 * bit_counts[0]) { bit_counts[0] -= 1; bit_counts[1] -= 4; message.push_back('o'); } else { bit_counts[0] -= 2; bit_counts[1] -= 3; message.push_back('g'); } } return message; } |