- Translate each rule into one explicit state update.
- Maintain the invariant after every processed item.
- Return the accumulated state once all relevant input has been handled.
Code notes
- 172 lines of C++ from the credited upstream file partition-array-for-maximum-xor-and-and.cpp.
- The implementation visibly relies on sequence storage.
- 17 loop blocks detected.
Complexity
Count the number and nesting of passes over the input, then include the maintained containers in the memory estimate.
Check the problem constraints before deciding whether this complexity will pass.
Use this to learn the idea, then write your own version.
123 45class Solution {6public:7 long long maximizeXorAndXor(vector<int>& nums) {8 const auto& bit_length = [](int x) {9 return (x ? std::__lg(x) : -1) + 1;10 };11 12 const int l = bit_length(ranges::max(nums));13 const int n = size(nums);14 const int full_mask = (1 << n) - 1;15 vector<int> and_arr(1 << n);16 vector<int> xor_arr(1 << n);17 for (int mask = 1; mask < (1 << n); ++mask) {18 const auto& lb = mask & -mask;19 const auto& i = __builtin_ctz(lb);20 and_arr[mask] = (mask ^ lb) ? (and_arr[mask ^ lb] & nums[i]) : nums[i];21 xor_arr[mask] = xor_arr[mask ^ lb] ^ nums[i];22 }23 int64_t result = 0;24 vector<int> base(l); 25 for (int mask = 1; mask < (1 << n); ++mask) {26 const auto& total_and = and_arr[mask];27 const auto& total_xor = xor_arr[full_mask ^ mask];28 base.assign(l, 0);29 for (int remain = full_mask ^ mask; remain; remain &= remain - 1) {30 const int i = __builtin_ctz(remain);31 int x = nums[i] & ~total_xor;32 for (int i = l - 1; i >= 0; --i) {33 if (!(x & (1 << i))) {34 continue;35 }36 if (base[i] == 0) {37 base[i] = x;38 break;39 }40 x ^= base[i];41 }42 }43 int max_xor = 0;44 for (int i = l - 1; i >= 0; --i) {45 if ((max_xor ^ base[i]) > max_xor) {46 max_xor ^= base[i];47 }48 }49 result = max(result, total_and + total_xor + static_cast<int64_t>(2) * max_xor);50 }51 return result;52 }53};54 55565758class Solution2 {59public:60 long long maximizeXorAndXor(vector<int>& nums) {61 const auto& bit_length = [](int x) {62 return (x ? std::__lg(x) : -1) + 1;63 };64 65 const int l = bit_length(ranges::max(nums));66 const auto& max_xor_subset = [&](const vector<int>& nums) { 67 vector<int> base(l);68 for (auto x : nums) { 69 for (int i = l - 1; i >= 0; --i) {70 if (!(x & (1 << i))) {71 continue;72 }73 if (base[i] == 0) {74 base[i] = x;75 break;76 }77 x ^= base[i];78 }79 }80 int max_xor = 0;81 for (int i = l - 1; i >= 0; --i) { 82 if ((max_xor ^ base[i]) > max_xor) {83 max_xor ^= base[i];84 }85 }86 return max_xor;87 };88 89 const int n = size(nums);90 const int full_mask = (1 << n) - 1;91 vector<int> and_arr(1 << n);92 vector<int> xor_arr(1 << n);93 for (int mask = 1; mask < (1 << n); ++mask) {94 const auto& lb = mask & -mask;95 const auto& i = __builtin_ctz(lb);96 and_arr[mask] = (mask ^ lb) ? (and_arr[mask ^ lb] & nums[i]) : nums[i];97 xor_arr[mask] = xor_arr[mask ^ lb] ^ nums[i];98 }99 int64_t result = 0;100 for (int mask = 1; mask < (1 << n); ++mask) {101 const auto& total_and = and_arr[mask];102 const auto& total_xor = xor_arr[full_mask ^ mask];103 vector<int> needs;104 for (int i = 0; i < n; ++i) {105 if (!(mask & (1 << i))) {106 needs.emplace_back(nums[i] & ~total_xor);107 }108 }109 result = max(result, total_and + total_xor + static_cast<int64_t>(2) * max_xor_subset(needs));110 }111 return result;112 }113};114 115116117118class Solution3 {119public:120 long long maximizeXorAndXor(vector<int>& nums) {121 const auto& bit_length = [](int x) {122 return (x ? std::__lg(x) : -1) + 1;123 };124 125 const int l = bit_length(ranges::max(nums));126 const auto& max_xor_subset = [&](const vector<int>& nums) { 127 vector<int> base(l);128 for (auto x : nums) { 129 for (int i = l - 1; i >= 0; --i) {130 if (!(x & (1 << i))) {131 continue;132 }133 if (base[i] == 0) {134 base[i] = x;135 break;136 }137 x ^= base[i];138 }139 }140 int max_xor = 0;141 for (int i = l - 1; i >= 0; --i) { 142 if ((max_xor ^ base[i]) > max_xor) {143 max_xor ^= base[i];144 }145 }146 return max_xor;147 };148 149 const int n = size(nums);150 int64_t result = 0;151 for (int mask = 1; mask < (1 << n); ++mask) {152 int and_val = -1;153 int xor_val = 0;154 for (int i = 0; i < n; ++i) {155 if (mask & (1 << i)) {156 and_val = (and_val != -1) ? (and_val & nums[i]) : nums[i];157 } else {158 xor_val ^= nums[i];159 }160 }161 vector<int> needs;162 for (int i = 0; i < n; ++i) {163 if (!(mask & (1 << i))) {164 needs.emplace_back(nums[i] & ~xor_val);165 }166 }167 result = max(result, and_val + xor_val + static_cast<int64_t>(2) * max_xor_subset(needs));168 }169 return result;170 }171};172