原题
https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/
思路
首先想到异或前缀和
然后最重要的就是异或公式推导
a = S i ⊕ S j a = S_i ⊕ S_j a=Si⊕Sj
b = S j ⊕ S k + 1 b = S_j ⊕ S_{k+1} b=Sj⊕Sk+1
a = b a = b a=b
S i ⊕ S j = S j ⊕ S k + 1 S_i ⊕ S_j = S_j ⊕ S_{k+1} Si⊕Sj=Sj⊕Sk+1
S i = S k + 1 S_i = S_{k+1} Si=Sk+1
在推导或等式s[i]==s[k+1]
的时候,完全把j
消掉了。
因此在s[i]=s[k+1]
的情况下,对于任意一个在( i , k ]
范围内的j
,a==b
都是恒成立的
题解
class Solution {
public int countTriplets(int[] arr) {
int len = arr.length;
int[] sum = new int[len+1];
int res = 0;
for (int i = 0; i < len; i++) {
sum[i+1] = sum[i] ^ arr[i];
}
for (int i = 0; i < len; i++) {
for (int k = i+1; k < len; k++) {
if (sum[i] == sum[k+1]) {
res += k - i;
}
}
}
return res;
}
}