"""
https://www.lanqiao.cn/problems/3400/learning/?page=1&first_category_id=1&problem_id=3400
"""
n = int(input())
a = list(map(int, input().split()))
# 预处理前缀异或, 方便后面求解区间异或
pre_xor = [0] * n
pre_xor[0] = a[0]
for i in range(1, n):
pre_xor[i] = pre_xor[i - 1] ^ a[i]
total = 0
# 枚举所有完全平方数(完全平方数的因子个数为奇数)
for x in range(0, 200):
xor = x * x
# 区间[l, r]的异或结果a[l]^...^a[r] = pre_xor[l - 1] ^ pre_xor[r]
# 题目转换成有多少个二元组<l, r>满足pre_xor[l - 1] ^ pre_xor[r] = xor
# pre_xor[l - 1] = xor ^ pre_xor[r]
# 对于每一个r, 找出左边有多少个值等于xor ^ pre_xor[r]
# 特例: 当l=0时, pre_xor[-1] ^ pre_xor[r] = xor 也就是 pre_xor[r] = xor, 也就是
# 0 ^ pre_xor[r] = xor, 也就是0 = xor ^ pre_xor[r], 意思是左边pre_xor[l - 1]值为0默认有1个
dic = {}
dic[0] = 1
for r in range(n):
total += dic.get(pre_xor[r] ^ xor, 0)
dic[pre_xor[r]] = dic.get(pre_xor[r], 0) + 1
# 总区间的个数减去区间异或结果的因子个数为奇数的区间的个数就是答案
ans = n * (n + 1) // 2 - total
print(ans)
蓝桥杯-异或森林
于 2024-04-01 23:39:03 首次发布