#include <bit> #include <cassert> #include <cstdint> #include <iostream> #include <string> #include <vector> class Solution { static auto construct_sets(const std::vector<std::string> &arr) -> std::vector<uint32_t> { std::vector<std::uint32_t> sets; for (const auto &word : arr) { std::uint32_t w = 0; for (char c : word) { auto mask = 1 << (c - 'a'); if ((w & mask) != 0) { w = 0; break; } w |= mask; } sets.push_back(w); } return sets; } static auto find_solution(const std::vector<std::uint32_t> &words, std::size_t i, std::uint32_t w) -> int { if (i == words.size()) { return std::popcount(w); } auto found_solution = find_solution(words, i + 1, w); if ((words[i] & w) == 0) { found_solution = std::max( found_solution, find_solution(words, i + 1, w | words[i])); } return found_solution; } public: int maxLength(const std::vector<std::string> &arr) { auto sets = construct_sets(arr); return find_solution(sets, 0u, 0u); } }; int main() { Solution s; assert(s.maxLength(std::vector{std::string{"un"}, std::string{"iq"}, std::string{"ue"}}) == 4); assert(s.maxLength(std::vector{std::string{"cha"}, std::string{"r"}, std::string{"act"}, std::string{"ers"}}) == 6); assert(s.maxLength( std::vector{std::string{"abcdefghijklmnopqrstuvwxyz"}}) == 26); return 0; }