链接:https://ac.nowcoder.com/acm/contest/20960/1023
来源:牛客网
来源:牛客网
题目描述
给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为0。
输入描述:
第一行一个数n表示数组长度; 第二行n个整数表示数组; 1<=n<=1000,0<=数组元素<100000。
输出描述:
一行一个整数表示答案。
示例1
输出
复制 55
//两个区间里面的数异或和为0证明两个区间里面的数异或和相等。
//可以以i为分隔,在前面求不同的以i为结束区间的异或和(维护一个前缀异或和方便求解,因为相同的区间中异或为0,所以两个区间异或和就是中间那一段的异或和)
//然后在后面求以i为开始的区间异或和,由于在前面的异或和值和个数的对应保存下来了,
//所以在后面与以i为开始的区间异或和的时候将i前面所有的区间都包含到位了。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int MAXN = 1003;
ll a[MAXN];
map<int, int> num;
int main() {
int n;
cin>>n;
int temp;
for (int i=1;i<=n;i++) {
cin>>temp;
a[i] = a[i-1]^temp;
}
ll ans = 0;
for (int i=1;i<=n;i++) {
for (int j=1;j<=i;j++) num[a[i]^a[j-1]]++;
for (int j=i+1;j<=n;j++) {
ans+=num[a[i]^a[j]];
}
}
cout<<ans;
return 0;
}

京公网安备 11010502036488号