链接: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; }