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]
is2 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
// 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;
}
};
// 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;
}
};
For the i
th bit, assume there are k
numbers whose i
th bit is 1
.
- If
k == 0
, all the xor results will have0
in thei
th bit. - If
k >= 1
, we can use thek
1
s to generatecomb(k, 1) + comb(k, 3) + comb(k, 5) + ... = 2^(k-1)
different ways to make the xor result1
. For the restn - k
numbers, there are2^(n-k)
ways to pick any of them. So in total there are2^(k-1) * 2^(n-k) = 2^(n-1)
ways to get1
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 i
th bit is 1
, the i
th 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);
}
};