Skip to content

Latest commit

 

History

History

1863

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

The XOR total of an array is defined as the bitwise XOR of all its elements, or 0 if the array is empty.

  • For example, the XOR total of the array [2,5,6] is 2 XOR 5 XOR 6 = 1.

Given an array nums, return the sum of all XOR totals for every subset of nums

Note: Subsets with the same elements should be counted multiple times.

An array a is a subset of an array b if a can be obtained from b by deleting some (possibly zero) elements of b.

 

Example 1:

Input: nums = [1,3]
Output: 6
Explanation: The 4 subsets of [1,3] are:
- The empty subset has an XOR total of 0.
- [1] has an XOR total of 1.
- [3] has an XOR total of 3.
- [1,3] has an XOR total of 1 XOR 3 = 2.
0 + 1 + 3 + 2 = 6

Example 2:

Input: nums = [5,1,6]
Output: 28
Explanation: The 8 subsets of [5,1,6] are:
- The empty subset has an XOR total of 0.
- [5] has an XOR total of 5.
- [1] has an XOR total of 1.
- [6] has an XOR total of 6.
- [5,1] has an XOR total of 5 XOR 1 = 4.
- [5,6] has an XOR total of 5 XOR 6 = 3.
- [1,6] has an XOR total of 1 XOR 6 = 7.
- [5,1,6] has an XOR total of 5 XOR 1 XOR 6 = 2.
0 + 5 + 1 + 6 + 4 + 3 + 7 + 2 = 28

Example 3:

Input: nums = [3,4,5,6,7,8]
Output: 480
Explanation: The sum of all XOR totals for every subset is 480.

 

Constraints:

  • 1 <= nums.length <= 12
  • 1 <= nums[i] <= 20

Related Topics:
Backtracking, Recursion

Solution 1. Brute Force

// OJ: https://leetcode.com/problems/sum-of-all-subset-xor-totals/
// Author: github.com/lzl124631x
// Time: O(2^N)
// Space: O(N)
class Solution {
    int ans = 0;
    void dfs(vector<int> &A, int start, int val) {
        if (start == A.size()) {
            ans += val;
            return;
        }
        dfs(A, start + 1, val ^ A[start]);
        dfs(A, start + 1, val);
    }
public:
    int subsetXORSum(vector<int>& A) {
        dfs(A, 0, 0);
        return ans;
    }
};

Solution 2. Brute Force

// OJ: https://leetcode.com/problems/sum-of-all-subset-xor-totals/
// Author: github.com/lzl124631x
// Time: O(2^N * N)
// Space: O(1)
class Solution {
public:
    int subsetXORSum(vector<int>& A) {
        int ans = 0;
        for (int m = 1, end = (1 << A.size()); m < end; ++m) {
            int total = 0;
            for (int i = 0; i < A.size(); ++i) {
                if (m >> i & 1) total ^= A[i];
            }
            ans += total;
        }
        return ans;
    }
};

Solution 3. Math

For the ith bit, assume there are k numbers whose ith bit is 1.

  • If k == 0, all the xor results will have 0 in the ith bit.
  • If k >= 1, we can use the k 1s to generate comb(k, 1) + comb(k, 3) + comb(k, 5) + ... = 2^(k-1) different ways to make the xor result 1. For the rest n - k numbers, there are 2^(n-k) ways to pick any of them. So in total there are 2^(k-1) * 2^(n-k) = 2^(n-1) ways to get 1 as the xor result.

Note that 2^(n-1) is irrelevant to k, so as long as k >= 1 i.e. there is a number whose ith bit is 1, the ith bit will contribute (1 << i) * 2^(n-1) to the result.

// OJ: https://leetcode.com/problems/sum-of-all-subset-xor-totals/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
    int subsetXORSum(vector<int>& A) {
        int bits = 0;
        for (int n : A) bits |= n;
        return bits * pow(2, A.size() - 1);
    }
};