diff --git a/cpp/2210/221031-CN.cpp b/cpp/2210/221031-CN.cpp new file mode 100644 index 0000000..e37d68a --- /dev/null +++ b/cpp/2210/221031-CN.cpp @@ -0,0 +1,47 @@ +#include +#include + +/** + * 481. Magical String + * + * A magical string s consists of only '1' and '2' and obeys the following rules: + * - The string s is magical because concatenating the number of contiguous occurrences of characters '1' and '2' generates the string s itself. + * The first few elements of s is s = "1221121221221121122……". If we group the consecutive 1's and 2's in s, it will be "1 22 11 2 1 22 1 22 11 2 11 22 ......" and the occurrences of 1's or 2's in each group are "1 2 2 1 1 2 1 2 2 1 2 2 ......". You can see that the occurrence sequence is s itself. + * Given an integer n, return the number of 1's in the first n number in the magical string s. + */ + +class Solution { +public: + static constexpr int magicalString(int n) { + if (n <= 3) return 1; + std::bitset<100000> s; + int i = 2, c[2] = {1, 2}; + s[1] = s[2] = true; + for (; c[0] + c[1] < n; ++i) { + s[c[i & 1]++ + c[i & 1 ^ 1]] = i & 1; + if (s[i]) + s[c[i & 1]++ + c[i & 1 ^ 1]] = i & 1; + } + return c[0] + (!(i & 1) ? 0 : (n - c[0] - c[1])); + } +}; + +int main() { + std::cout << Solution::magicalString(4) << "\n"; + std::cout << Solution::magicalString(5) << "\n"; + std::cout << Solution::magicalString(6) << "\n"; + std::cout << Solution::magicalString(7) << "\n"; + std::cout << Solution::magicalString(8) << "\n"; + std::cout << Solution::magicalString(9) << "\n"; + std::cout << Solution::magicalString(10) << "\n"; + std::cout << Solution::magicalString(11) << "\n"; + std::cout << Solution::magicalString(12) << "\n"; + std::cout << Solution::magicalString(13) << "\n"; + std::cout << Solution::magicalString(14) << "\n"; + std::cout << Solution::magicalString(15) << "\n"; + std::cout << Solution::magicalString(16) << "\n"; + std::cout << Solution::magicalString(17) << "\n"; + std::cout << Solution::magicalString(18) << "\n"; + std::cout << Solution::magicalString(19) << "\n"; + return 0; +} diff --git a/cpp/2210/CMakeLists.txt b/cpp/2210/CMakeLists.txt index f1cbc27..926cc72 100644 --- a/cpp/2210/CMakeLists.txt +++ b/cpp/2210/CMakeLists.txt @@ -3,4 +3,4 @@ PROJECT(2210) SET(CMAKE_CXX_STANDARD 23) -ADD_EXECUTABLE(2210 221030.cpp) +ADD_EXECUTABLE(2210 221031-CN.cpp)