给定大小为A[]
和n<=100000
的数组0<=A[i]<=2^64
,并且A[]
的每两个相邻元素在其二进制表示中只有一个不同的数字。现在,我们必须检查数组中是否存在4
元素A[i1],A[i2],A[i3] and A[i4]
,1<=i1<i2<i3<i4<=n
和A[i1] xor A[i2] xor A[i3] xor A[i4] = 0
。
答案 0 :(得分:4)
提示:根据这些规则,两个数字XOR可能为零吗?为什么或者为什么不?这两个数字相对于彼此会是什么样的?
答案 1 :(得分:3)
由于两个相邻的数字相差一个二进制位,因此将两个相邻数字进行异或运算的结果是非常可预测的:
x
表示其值无关紧要,但与其下方/上方对应的x
相同。
xxxxxxxxxxxxx1xxxxxxxxxxxx
xor: xxxxxxxxxxxxx0xxxxxxxxxxxx
__________________________________
00000000000001000000000000
对于您描述的集合中的任何两个相邻数字都是如此。
如果您可以找到另一对相邻的数字,它们的位数相同,则它们也会异或为相同的值:00000000000001000000000000
最后,将这两个值合并在一起将绝对给你一个零的最终答案。
所以你想要的算法如下:
这是你的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]