题意:输出数组中有多少段的异或和为0
题解:当时做的时候想到异或前缀和当时没想到map,然后.....
本题用当前位置map映射第一位元素到当前位置的异或和相等的位置的个数
为什么呢?因为a^a=0
所以sum[1,l]=sum[1,r] =>sum[l,r]=0
#include <bits/stdc++.h> #define debug(x) cerr<<#x<<'='<<x<<endl #define set0(x) memset(x,0,sizeof(x)) using namespace std; typedef long long ll; typedef pair<ll,ll> pii; template<typename T> void read(T &x){ x = 0;char ch = getchar();ll f = 1; while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();} while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f; } ll n,a[200010],ans = 0; map<ll,int> Mp; int main() { read(n); ll csu = 0; Mp[0] = 1; for(int i=0;i<n;i++){ read(a[i]); csu^=a[i]; ans+=Mp[csu]; Mp[csu]+=1; } cout<<ans<<endl; return 0; }