思路:设
S
0
=
0
,
S
i
=
a
0
⨁
a
1
⨁
…
…
⨁
a
i
−
1
S_0=0,S_i=a_0\bigoplus a_1\bigoplus……\bigoplus a_{i-1}
S0=0,Si=a0⨁a1⨁……⨁ai−1,由异或性质可知,数组
a
r
r
arr
arr的
[
i
,
j
−
1
]
[i,j-1]
[i,j−1]的异或和等于
S
j
⨁
S
i
S_j \bigoplus S_i
Sj⨁Si,那么由题目的
a
=
b
a=b
a=b可以化简得到
S
i
=
S
k
+
1
S_i=S_{k+1}
Si=Sk+1,此时
j
j
j有
k
+
1
−
i
k+1-i
k+1−i种选择,它们都是符合题意的解。所以我们可以
O
(
n
2
)
O(n^2)
O(n2)枚举
i
、
k
i、k
i、k计算答案。更优的解决方案需要用到哈希表,假设我们在枚举
k
k
k,此时有
i
1
、
i
2
、
…
…
i
m
i_1、i_2、……i_m
i1、i2、……im都满足
S
i
=
S
k
S_i=S_k
Si=Sk,那么它们对答案的贡献为:
∑
t
=
1
m
(
k
−
1
−
i
t
)
=
m
∗
(
k
−
1
)
−
∑
t
=
1
m
i
t
\sum_{t=1}^m(k-1-i_t)=m*(k-1)-\sum_{t=1}^mi_t
∑t=1m(k−1−it)=m∗(k−1)−∑t=1mit,两个哈希表即可解决。
class Solution {
public:
int countTriplets(vector<int>& arr) {
int n=arr.size(),cur=0,ans=0;
unordered_map<int,int> cnt,sum;
cnt[0]=1;
for(int i=1;i<=n;i++)
{
cur^=arr[i-1];
ans+=cnt[cur]*(i-1)-sum[cur];
++cnt[cur];
sum[cur]+=i;
}
return ans;
}
};