这道题是利用前缀和来求解的,sum从头开始不断^表示现在的状态,原理是如果sum[l-1]=sum[r]就说明l到r的子段异或和为0,那么我们用一个map存储某一个输出所出现个数,因为每一次出现这个数都会产生这个数出现次数的新子集(只有首尾相等就说明这段可行·)至于为什么一定要用map是因为数组可能出现的范围过大,直接用数组存会爆栈‘代码很简短
# include <bits/stdc++.h>
using namespace std;
map <long long int,int> m;
int main()
{
long long n,sum=0,ans=0;
cin>>n;
m[0]=1;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
sum^=x;
ans+=m[sum]++;
}
cout<<ans;
return 0;
}