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

时间:2018-09-20 07:27:08

标签: algorithm dynamic-programming sub-array subsequence

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

找到最长子数组的长度,并返回此子数组的开始和结束索引。

1 个答案:

答案 0 :(得分:3)

计算从0个元素到所有元素的数组的运行XOR。以您的示例为例:

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

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

创建两个映射,存储第一个和最后一个看到的XOR值。贯穿它们,找到差异最大的一对。

在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是输入数组的大小。