给自己跪了,这道题居然没做出来o(╥﹏╥)o

题目大意:
给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为0。
n<=1000,数组中的数字<100000

思路:
一开始想的是枚举中间点,然后开一个f[i][k]数组表示到i点异或和为k的数量,然后从左算一遍,从右算一遍相乘就好了。无奈空间时间都不可用。

看了题解。。
枚举其中一个区间[i,j],其实显然这个区间的异或和我们可以利用前缀和计算。
那么我们只需要知道[1,i-1]中有多少个区间的异或和与当前[i,j]的相同就好了。
其实枚举一遍放桶里就好了!!
枚举的是以a[i-1]作为结尾的区间的异或结果放入桶中。
前面的都不需要枚举了,因为之前已经算过放到桶里了。

复杂度O(n^2)。
我好菜。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[1004],sum[1004],cnt[200040];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++){
        sum[i]=sum[i-1]^a[i];
    }
    long long ans=0;
    for(int i=2;i<=n;i++){
        for(int k=1;k<i;k++){
            int t=sum[i-1]^sum[k-1];
            cnt[t]++;
        }
        for(int j=i;j<=n;j++){
            int t=sum[j]^sum[i-1];
            ans+=cnt[t];
        }

    }
    cout<<ans<<endl;
    return 0;
}