如何在数组中找到4个XOR等于零的数字?

时间:2012-07-02 22:18:43

标签: c algorithm

给定大小为A[]n<=100000的数组0<=A[i]<=2^64,并且A[]的每两个相邻元素在其二进制表示中只有一个不同的数字。现在,我们必须检查数组中是否存在4元素A[i1],A[i2],A[i3] and A[i4]1<=i1<i2<i3<i4<=nA[i1] xor A[i2] xor A[i3] xor A[i4] = 0

6 个答案:

答案 0 :(得分:4)

提示:根据这些规则,两个数字XOR可能为零吗?为什么或者为什么不?这两个数字相对于彼此会是什么样的?

答案 1 :(得分:3)

由于两个相邻的数字相差一个二进制位,因此将两个相邻数字进行异或运算的结果是非常可预测的:

x表示其值无关紧要,但与其下方/上方对应的x相同。

        xxxxxxxxxxxxx1xxxxxxxxxxxx
xor:    xxxxxxxxxxxxx0xxxxxxxxxxxx
__________________________________
        00000000000001000000000000

对于您描述的集合中的任何两个相邻数字都是如此。

如果您可以找到另一对相邻的数字,它们的位数相同,则它们也会异或为相同的值:00000000000001000000000000

最后,将这两个值合并在一起将绝对给你一个零的最终答案。


所以你想要的算法如下:

  • 确定数字与其后继者(位0-63)之间的哪个位不同
  • 找到另一对数字,这些数字也会因步骤1中确定的相同位而不同。

这是你的4个值。

注意,如果N> 64,然后由pigeonhole priniciple,必须有这样的解决方案 如果N <= 64,那么可能是此表单的解决方案,或者是其他表单的解决方案,我在此处没有描述。

还有其他约束也可以找到4个数字xor一起到0 但这可能是寻找解决方案的最简单方法 但是,未能以这种方式找到解决方案并不能保证没有解决方案。

答案 2 :(得分:2)

提示:查看XOR的真值表:

A | B | Output
- + - + - - - 
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0 

现在,什么二进制数XOR与10101为0?

这些是要查找的数字类型。

编辑: 一旦你发现这些数字之间的关系,你似乎从你对@abelenky的答案的评论中得到了什么,你就必须看看问题的其他部分。由于每个相邻元素在其二进制表示中只有一个不同的数字,这对于我们正在寻找的两个相邻元素的可能性意味着什么?

答案 3 :(得分:1)

这是来自CodeChef当前运行的算法竞赛的问题。 问题为http://www.codechef.com/JULY12/problems/GRAYSC的链接。因此,使用不公平的方法,应删除问题。

答案 4 :(得分:0)

对两个相邻数字的xor的所有可能值进行一些仔细观察,总共有多少不同的值可能?一旦你搞清楚了,你就会有答案。

答案 5 :(得分:0)

提示:如果您完全陷入困境,请尝试O(n ^ 4)解决方案:

for i = 0 to N-3
  for j = i+1 to N-2
    for k = j+1 to N-1
      for l = k+1 to N
         if a[i] XOR a[j] XOR a[k] XOR a[l] is equal to 0 then
           print a[i], a[j], a[k], a[l]