連接:https://ac.nowcoder.com/acm/contest/3005/Dios
題意:數組
給一個數組,問有多少個子序列的異或和爲0spa
思路:code
首先咱們須要一個定義一個前綴和數組sum[i],表明從1到i這段的異或和blog
那麼神奇的事情來了,sum[l-r]=sum[l-1]^sum[r],由於他們相同的部分異或起來爲0,這也是與普通前綴和不一樣的部分ci
若是這段的異或和爲0,那麼sum[l-1]^sum[r]=0,也就是sum[l-1]=sum[r],所以咱們只須要統計每一個前綴和的數值,看有多少前綴和相同get
最後答案就爲∑cnti*(cnti-1)it
#include<iostream> #include<algorithm> #include<map> using namespace std; const int maxn=2e5+10; typedef long long ll; ll a[maxn]; map<ll,ll> s; int main() { ll ans=0,n,sum=0; cin>>n; s[0]=1; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); sum^=a[i]; ans+=s[sum]; s[sum]+=1; } cout<<ans<<endl; return 0; }