题意:就是求一段[l,r]使得r-l+1是偶数且 a_l⊕a_l+1⊕…⊕a_mid=a_mid+1⊕a_mid+2⊕…⊕a_r的区间。
解法:如果A^B=C, 那么A=B^C,(两边都是异或上B,自己异或自己等于0),由此可得区间异或的计算:领pre_i为前i个值的异或和,则[l,r]=pre_l-1^pre_r:因为pre_r等于pre_l-1^[l,r]的异或和,再异或一次pre_l-1即得到[l,r],因此区间的异或和可以用前缀异或和运算而得到。可以通过同样的方法推导出符合题意的区间是pre_r==pre_l 且 r和l奇偶性相同的区间(想一想为什么)。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
long long a[maxn],n;
map<long long,int> mp;
int g[maxn][2];
int main(){
scanf("%lld",&n);
long long res = 0;
int len = 0;
long long ans = 0;
for(int i = 1; i <= n; i++) scanf("%lld",&a[i]);
for(int i = 0; i <= n; i++){
res = res^a[i];
if(!mp[res]) mp[res]=++len;
ans += g[mp[res]][i%2];
g[mp[res]][i%2]++;
}
printf("%lld\n",ans);
}