For a permutation, we can use prefix XOR to compute the XOR of any subarray in O(1) time. For all i ≤ j ≤ k, the XOR of nums[i] ^ … ^ nums[k] can be written as prefix[k+1] ^ prefix[i]. We can enumerate all (i, k) pairs and for each, enumerate all j in [i, k], but since XOR is associative, every (i, k) pair gives (k-i+1) triplets with the same value. We only need to collect all possible prefix[i] ^ prefix[k+1] values.
classSolution {
public:int countTriplets(vector<int>& nums) {
int n = nums.size();
vector<int> pre(n+1);
for (int i =0; i < n; ++i) pre[i+1] = pre[i] ^ nums[i];
unordered_set<int> s;
for (int i =0; i < n; ++i) {
for (int k = i; k < n; ++k) {
s.insert(pre[i] ^ pre[k+1]);
}
}
return s.size();
}
};
classSolution {
publicintcountTriplets(int[] nums) {
int n = nums.length;
int[] pre =newint[n+1];
for (int i = 0; i < n; i++) pre[i+1]= pre[i]^ nums[i];
Set<Integer> s =new HashSet<>();
for (int i = 0; i < n; i++) {
for (int k = i; k < n; k++) {
s.add(pre[i]^ pre[k+1]);
}
}
return s.size();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classSolution {
funcountTriplets(nums: IntArray): Int {
val n = nums.size
val pre = IntArray(n+1)
for (i in0 until n) pre[i+1] = pre[i] xor nums[i]
val s = mutableSetOf<Int>()
for (i in0 until n) {
for (k in i until n) {
s.add(pre[i] xor pre[k+1])
}
}
return s.size
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution:
defcountTriplets(self, nums: list[int]) -> int:
n = len(nums)
pre = [0]*(n+1)
for i in range(n):
pre[i+1] = pre[i] ^ nums[i]
s = set()
for i in range(n):
for k in range(i, n):
s.add(pre[i] ^ pre[k+1])
return len(s)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use std::collections::HashSet;
impl Solution {
pubfncount_triplets(nums: Vec<i32>) -> i32 {
let n = nums.len();
letmut pre =vec![0; n+1];
for i in0..n { pre[i+1] = pre[i] ^ nums[i]; }
letmut s = HashSet::new();
for i in0..n {
for k in i..n {
s.insert(pre[i] ^ pre[k+1]);
}
}
s.len() asi32 }
}