主 要 是 对 异 或 性 质 的 应 用 主要是对异或性质的应用

记 a l 到 a m i d 的 异 或 结 果 是 q , a m i d + 1 到 a r 的 异 或 结 果 是 w 记a_l到a_{mid}的异或结果是q,a_{mid+1}到a_r的异或结果是w alamidq,amid+1arw

那 么 要 找 的 就 是 q = = w 的 偶 数 区 间 那么要找的就是q==w的偶数区间 q==w

转 化 以 下 , 因 为 q = = w , 所 以 q 异 或 w 为 0 转化以下,因为q==w,所以q异或w为0 ,q==w,qw0

也 就 是 要 找 一 段 区 间 , 使 得 区 间 长 是 偶 数 且 异 或 和 为 0 也就是要找一段区间,使得区间长是偶数且异或和为0 ,使0

那 么 利 用 异 或 前 缀 和 , 设 p r e [ i ] 是 i 处 的 异 或 前 缀 和 那么利用异或前缀和,设pre[i]是i处的异或前缀和 ,pre[i]i

此 时 如 果 有 一 个 l 满 足 p r e [ l − 1 ] = = p r e [ i ] , 那 么 区 间 [ l , i ] 异 或 一 定 是 0 此时如果有一个l满足pre[l-1]==pre[i],那么区间[l,i]异或一定是0 lpre[l1]==pre[i],[l,i]0

注 意 因 为 区 间 是 偶 数 , 所 以 l − 1 和 i 一 定 同 奇 同 偶 注意因为区间是偶数,所以l-1和i一定同奇同偶 ,l1i

#include <bits/stdc++.h>
using namespace std;
const int maxn=1<<21;
int pre,x,vis[2][maxn];
long long ans;
int main()
{
	int n;
	cin>>n;
	vis[0][0]++;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		pre=pre^x;
		ans+=vis[i%2][ pre ];
		vis[i%2][ pre ]++;
	}
	cout<<ans;
}