• 题意:可以简单理解成,存在多少对不重叠的非空区间,且区间异或值相等

  • 思路:根据前缀异或和的性质,设表示的区间异或和,那么的区间异或值就等于,因为只有,双重循环遍历,枚举端点,先记录以为右端点的所有区间异或值,存到数组,然后再记录以为左端点的值,保证区间不重叠,更新答案

  • 时间复杂度:

  • 代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int maxn = 1005;
    int a[maxn],pre[maxn],b[1000010];
    int main()
    {
      int n;
      ll ans = 0;
      cin>>n;
      for(int i=1;i<=n;i++)cin>>a[i],pre[i] = pre[i-1]^a[i];
      for(int i=1;i<=n;i++){
          for(int j=1;j<=i;j++)
              b[pre[j-1]^pre[i]]++;
          for(int j=i+1;j<=n;j++)
              ans += 1ll*b[pre[j]^pre[i]];
      }
      cout<<ans<<endl;
      return 0;
    }