题目链接:https://leetcode.cn/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/
题目大意:给出一个数组arr[]
,求满足以下条件的三元组i, j, k
的个数:
arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1] == arr[j] ^ arr[j + 1] ^ ... ^ arr[k]
思路:这题没思路的一个原因可能是对【异或运算的性质】不太熟悉。异或是有结合律和交换律的,因此看到这种【连异或】,可以想到【连加】的类似操作,就是求前缀和。设xora[i]
是从0
连异或到i-1
的数,那么很容易得到xora[]
数组。
然后就是寻找某个三元组,这其实可以用二重循环就解决。异或的另一个性质:自己异或自己等于0
。那么很明显这个三元组代表的区间的第一段异或第二段是等于0的。因此考虑两边的i
和k
,如果有两个相等的元素(意味着他们会异或为0),那么j
可以从中间人任意取了,给答案加上k-i
(k
可以等于j
)
可以看到,无论是构建前缀和数组xora[]
还是将三重循环改为二重循环,都用到了异或的性质。因此这些性质要好好牢记。
完整代码
class Solution {
public:
int countTriplets(vector<int>& arr) {
int n = arr.size();
vector<int> xora(n+1);
xora[0] = 0;
for (int i = 1; i <= n; i++) {
xora[i] = xora[i-1] ^ arr[i-1];
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int k = i + 1; k < n; k++) {
if (xora[i] == xora[k+1]) {
ans += k-i;
}
}
}
return ans;
}
};