如何找到异或为0的最长连续子数组

How to find the longest contiuous subarray whose XOR is 0

例如,给定 {1,1,2,2}: 这些子数组的异或都为 0:{1,1}、{2,2}、{1,1,2,2}。 最长的长度是4.

找到最长子数组的长度和return这个子数组的开始和结束索引。

计算数组的运行异或,从0个元素到所有元素。以你的例子:

initial 
segment         XOR
[]              0
[1]             1
[1, 1]          0
[1, 1, 2]       2
[1, 1, 2, 2]    0

如果两个 运行 异或值相同,则这两个值之间的子数组将异或为 0。

创建两个映射,存储第一个和最后一个异或值。 运行通过它们,找出差异最大的一对。

在Python中:

def continuous_xor(xs):
    xor = 0
    first_seen = {0: 0}
    last_seen = {0: 0}
    for i, x in enumerate(xs):
        xor = xor ^ x
        if xor not in first_seen:
            first_seen[xor] = i+1
        last_seen[xor] = i+1
    return max((last_seen[i]-first_seen[i], first_seen[i], last_seen[i]) for i in last_seen)

print continuous_xor([1, 1, 2, 2])
print continuous_xor([5, 1, 4, 3, 2, 4, 6])

子数组的索引是Python式,起始索引是包含的,结束索引是不包含的。

这在 O(n) 时间内运行,其中 n 是输入数组的大小。