题目
思路
首先,本题存在区间求和问题,因此需要求出前缀数组prefix
,使得prefix[i] == arr[0] ^ arr[1] ^ ... ^ arr[i]
。
第二,观察可知,要满足a == b
,即满足a ^ b == 0
,即arr[i] ^ ... ^ arr[k] == 0
。根据前缀数组求区间的方法,即有prefix[k] ^ prefix[i-1] == 0
,即prefix[k] == prefix[i-1]
当
i == 0
时,设prefix[i - 1] = 0
第三,当确定满足a == b
的i
和k
后,可以取任何i<j<=k
,因此,每找到一组i
和k
,最终结果应该加k-i
。
代码
class Solution {
public:
int countTriplets(vector<int>& arr) {
// 多分配一个元素的空间
int* prefix = new int[arr.size() + 1];
// 将第一个元素置为0
prefix[0] = 0;
// 数组起始位置向后移动1(使得prefix[-1] == 0)
prefix = prefix + 1;
prefix[0] = arr[0];
for(int i=1; i<arr.size(); i++) {
prefix[i] = prefix[i - 1] ^ arr[i];
}
int total = 0;
for(int i=0; i<arr.size() - 1; i++) {
for (int k=i+1; k<arr.size(); k++) {
if (*(prefix + k) == *(prefix + i - 1)) {
total += k - i;
}
}
}
return total;
}
};