查找子集的数量,其余数字的xor等于0

时间:2015-11-15 23:45:57

标签: algorithm dynamic-programming xor

给定n个数字,找到最小数量的子集,使剩余数字的xor等于0.例如:

cart[i]

结果等于3,因为我们可以删除子集{1,3}(以两种方式)或{3,4,5}。

我正在寻找比O(2 ^ n)暴力更快的东西。

这是该问题的副本: Find number of subsets, that xor of remaining numbers equals to 0

但OP标记的答案真的不清楚。你能重新描述一下吗?或者只是自己添加一些东西。

1 个答案:

答案 0 :(得分:0)

阐述我以前的answer

输入:大小为n的数组a 1 <= a[i] <= m

输出:子集数量,使剩余数字的xor为零。请注意,这相当于xor = X where X = xor of all elements of a

的子集数

考虑你的例子,

X = XOR({1,1,3,4,5}) = 2 验证XOR({1,3})=2XOR({3,4,5})=2

其中XOR(set)== XOR of all elements of set


解决方案

考虑大小为n * m的Dynamic Programming表。

D[i][j] = #subsets considering first i elements of a whose xor is j

现在要计算表,您需要定义以下递归关系:

D[i][j] = D[i-1][j] + D[i-1][j xor a[i]]

直觉/证明:

您需要计算xor为j的第一个i元素的子集数。专注于ith元素a [i],

  • a [i]在subset =&gt;中不存在xor为j的i-1元素的任何子集都是有效的
  • a [i]出现在subset =&gt;中xor为i-1的{​​{1}}个元素的任何子集都有效。这是因为当我们在这个集合中添加[i]时,我们有j xor a[i]。所以新集的xor是j。
  • 答案:最后你已经填满了整张桌子。您的答案是j xor a[i] xor a[i] = j,因为您需要xor为X的子集。

    PS:如果您仍然感到困惑,我建议您使用动态编程技术。试试你的例子,你可能会更好地理解它。