diff --git a/cpp/number-of-wonderful-substrings.cpp b/cpp/number-of-wonderful-substrings.cpp new file mode 100644 index 0000000..2c2568f --- /dev/null +++ b/cpp/number-of-wonderful-substrings.cpp @@ -0,0 +1,29 @@ +#include +#include +#include + +class Solution { + static const std::uint32_t BIT = 1; + + public: + long long wonderfulSubstrings(const std::string &word) { + long long result = 0; + + std::unordered_map freqs; + freqs[0] = 1; + + std::uint32_t mask = 0; + for (char c : word) { + mask ^= BIT << (c - 'a'); + + result += freqs[mask]; + ++freqs[mask]; + + for (auto odd_c = 0; odd_c < 10; ++odd_c) { + result += freqs[mask ^ (BIT << odd_c)]; + } + } + + return result; + } +};