#include <iostream> #include <stdio.h> #include <map> using namespace std; typedef long long Int; int n; int arr[51]; int psum[51]; int m; map<int,int> prefixes[51]; map<int,int> suffixes[51]; map<int,int>::iterator myit,it2; int main() { //freopen("test.txt","r",stdin); int i,j; int sum; int L,R; int need; Int answer=0; scanf("%d",&n); m=n/2; psum[0]=0; for (i=1;i<=n;i++) { scanf("%d",&arr[i]); psum[i]=psum[i-1]+arr[i]; } prefixes[0].insert(make_pair(0,1)); for (i=1;i<=m;i++) { sum=arr[i]; for (j=i-1;j>=0;j--) { for (myit=prefixes[j].begin();myit!=prefixes[j].end();myit++) { it2=prefixes[i].insert( make_pair( (sum^((*myit).first)),0 ) ).first; (*it2).second=(*it2).second+(*myit).second; } sum+=arr[j]; } } suffixes[n+1].insert(make_pair(0,1)); for (i=n;i>m;i--) { sum=arr[i]; for (j=i+1;j<=n+1;j++) { for (myit=suffixes[j].begin();myit!=suffixes[j].end();myit++) { it2=suffixes[i].insert( make_pair( (sum^((*myit).first)),0 ) ).first; (*it2).second=(*it2).second+(*myit).second; } sum+=arr[j]; } } for (myit=prefixes[m].begin();myit!=prefixes[m].end();myit++) { //cout<<"We can get prefix of "<<(*myit).first<<" in "<<(*myit).second<<" ways "<<endl; it2=suffixes[m+1].find( (*myit).first ); if (it2!=suffixes[m+1].end()) { //if ( (*it2).second>0 ) //{ // cout<<"Adding "<<(*it2).second<<" initially"<<endl; //} answer+=(Int)( (*it2).second )*(Int)( (*myit).second ); } } for (L=1;L<=m;L++) { for (R=m+1;R<=n;R++) { for (myit=prefixes[L-1].begin();myit!=prefixes[L-1].end();myit++) { need=( (psum[R]-psum[L-1])^( (*myit).first ) ); it2=suffixes[R+1].find(need); if (it2!=suffixes[R+1].end()) { //if ( (*it2).second>0 ) //{ // cout<<"Adding "<<(*it2).second<<" from "<<L<<"~"<<R<<endl; //} answer+=(Int)( (*it2).second ) * (Int)( (*myit).second ); } } } } printf("%lld\n",answer); return 0; }