Problem:

给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为0。

Solution:

题目是求有多少不相交的区间异或值相等(吐血,一开始看错题了,以为是有多少个不相交的区间,且区间内的异或和为0)
tip:当需要两个不相交区间时,我们可以首先给他们划分一个分割线,然后再进行左边部分区间的枚举和右边部分区间的枚举(按这个方法可以枚举所有不相交的区间,并且不会重复)

// https://ac.nowcoder.com/acm/problem/14247
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define _for(i,s,t) for(int i=s;i<t;i++)
#define _rof(i,s,t) for(int i=s;i>t;i--)
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define per(i,s,t) for(int i=s;i>=t;i--)
#define Ri(x) scanf("%d",&x)
#define Rii(x,y) scanf("%d%d",&x,&y)
#define INF 0x3f3f3f3f
using namespace std;
template<class T>inline void read(T &res)
{
    char c;T flag=1;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
    while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
typedef long long ll;
const int maxn = 1e3 + 10;
int presum[maxn];
map<int,int> mp;
int main(){
    IOS;
    int n,index = 0;
    cin>>n;
    rep(i,1,n){
        cin>>presum[i];
        presum[i] ^= presum[i - 1];
    }
    int ans = 0;
    rep(i,1,n){
        rep(l,1,i){// 枚举[l,i](l = 1 ~ i) 
            mp[presum[l - 1] ^ presum[i]] ++;
        }
        rep(r,i + 1,n){// 枚举[i,r] (r = i + 1 ~ n) 此时统计答案 
            ans += mp[presum[i] ^ presum[r]];
        }
    } 

    cout<<ans<<endl;
    return 0;
}
/**
Problem:
给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为0。

Solution:
题目是求有多少不相交的区间异或值相等(吐血,一开始看错题了,以为是有多少个不相交的区间,且区间内的异或和为0) 
tip:当需要两个不相交区间时,我们可以首先给他们划分一个分割线,然后再进行左边部分区间的枚举和右边部分区间的枚举(按这个方法可以枚举所有不相交的区间,并且不会重复) 
*/