📌  相关文章
📜  XOR值为奇数的最长子序列的长度(1)

📅  最后修改于: 2023-12-03 15:06:05.021000             🧑  作者: Mango

XOR值为奇数的最长子序列的长度

在给定序列中,求一个最长的子序列,使得这个子序列的异或值为奇数。

算法分析
前缀异或

对于一个序列A,我们可以求出其前缀异或数组pre_xor,其中pre_xor[i]表示A[0]^A[1]^...^A[i-1]。假设从i到j的异或值为odd,那么A[i]^...^A[j]=pre_xor[i]^pre_xor[j+1]^odd,其中odd为1或0。所以问题转化为求最长的区间长度,使得pre_xor[i]^pre_xor[j+1]的奇偶性为1。

奇偶性判断

两个数的异或值为奇数,当且仅当这两个数其中一个是奇数,另一个是偶数。所以可以用一个map记录每个前缀异或值出现的最后一个位置,然后查找前缀异或值为奇数的最大区间长度即可。

时间复杂度

时间复杂度为O(NlogN),其中N为序列长度。

代码实现
def max_xor_length(arr):
    pre_xor = [0]
    for a in arr:
        pre_xor.append(pre_xor[-1] ^ a)
    last = {0: 0}
    ans = 0
    for i in range(1, len(pre_xor)):
        if pre_xor[i] not in last:
            last[pre_xor[i]] = i
        if pre_xor[i] % 2 == 0:
            ans = max(ans, i - last[pre_xor[i]] + 1)
        else:
            ans = max(ans, i - last[pre_xor[i]] if last[pre_xor[i]] != i else 0)
    return ans

其中,arr为原始序列,返回值为最长的子序列长度。