Skip to content

Xor

LeetCode Problem

# https://leetcode.com/problems/sum-of-all-subset-xor-totals/description/
from itertools import combinations


class Solution:
    def subsetXORSum(self, nums):
        def xor(subset):
            ans = 0
            for i in range(len(subset)):
                ans ^= subset[i]
            return ans

        result = 0
        for r in range(len(nums) + 1):
            for subset in combinations(nums, r):
                result += xor(subset)
        return result


# How to do it without combinations? Recursion backtrack and calculate XOR on the fly.
# better solution
def subsetXORSum(nums):
    # generate all subsets
    def dfs(idx, curr_xor):
        if idx == len(nums):
            return curr_xor
        # include curr element
        include = dfs(idx + 1, curr_xor ^ nums[idx])
        # exclude curr element
        exclude = dfs(idx + 1, curr_xor)
        return include + exclude

    return dfs(0, 0)


def main():
    print(subsetXORSum(nums=[1, 3]))
    print(subsetXORSum(nums=[5, 1, 6]))


main()