题意:求一个数组中的有多少组两个互不相交的区间异或和为零。
思路:直接暴力,从左到右枚举数组,将以当前元素的前一个元素为右端点,枚举该类区间的异或和,用一个数组仿map容器记录个数,再以当前元素左端点,枚举该类区间的异或和,将map容器中值相同的数的个数加起来就是结果了
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 998244353
int a[1005], ma[500005];
int main()
{
int n;
ll z=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<n;i++)
{
int k=0;
for(int j=i-1;j>=0;j--)
{
k=k^a[j];
ma[k]++;
}
k=0;
for(int j=i;j<n;j++)
{
k=k^a[j];
z=z+ma[k];
}
}
printf("%lld\n",z);
return 0;
}

京公网安备 11010502036488号