题目
思路
已知结论:[1,l−1]⊕[1,r]=[l,r]
所以如果一个区间[l,r]异或和为0,那么就证明[1,l−1]==[1,r],所以只要预处理出来所有[1,i]的值,在排序,有多少个相等的数,求排列即可
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int q[N], n;
int all[N];
ll ans = 0;
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &q[i]);
all[i] = all[i - 1] ^ q[i];
}
sort(all + 1, all + 1 + n);
for(int i = 0; i <= n; ) {
int j = i + 1; ll t = 1;
while(j <= n && all[i] == all[j]) j++, t++;
ans += (t - 1) * t / 2;
i = j;
}
printf("%lld\n", ans);
return 0;
}