首先可利用前缀和求取区间的异或和,然后,我就写了一个四重循环然后TLE了。
枚举每个点,之后记录以这个点为末尾的所有区间的异或和,然后枚举所有以这个点为起点的区间的值,当存在二者数值相等时,说明异或和为零,此时结果数目+1即可
一年前不会写这道题,一年后还是不会,属于是属于是了。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> p(n + 1, 0);
vector<int> sum(n + 1, 0);
for(int i = 1; i <= n; i++) {
cin >> p[i];
sum[i] = sum[i - 1]^p[i];
}
long long res = 0;
map<int, int> tmp;
for(int i = 1; i <= n; i++) {
for(int left = 1; left <= i; left++) {
int tmp1 = sum[left - 1]^sum[i];
tmp[tmp1] += 1;
}
for(int right = i + 1; right <= n; right++) {
int tmp2 = sum[right]^sum[i];
res = res + tmp[tmp2];
}
}
cout << res << endl;
return 0;
}