# 1442. Count Triplets That Can Form Two Arrays of Equal XOR
# # Tóm tắt đề bài
Bạn được cho một mảng số nguyên `arr`.
Nhiệm vụ của bạn là tìm ba chỉ số `i, j,` và `k` sao cho:
- `0 ≤ i < j ≤ k < arr.length`
Định nghĩa hai giá trị a và b như sau:
* a là kết quả của phép XOR tất cả các phần tử từ chỉ số i đến j-1
* b là kết quả của phép XOR tất cả các phần tử từ chỉ số j đến k
Bạn cần đếm số bộ ba (i, j, k) thoả mãn điều kiện a = b.
### Giới hạn
* 1 <= arr.length <= 300
* 1 <= arr[i] <= 108
## Lời giải
- Với phép toán XOR, ta có nếu a = b thì **a^b = 0**.
- Vì vậy, nếu a ^ b ^ c ^ d = 0 thì ta có: a = b ^ c ^ d, a ^ b = c ^ d, a ^ b ^ c = d, b ^ d = a ^ c,....
- Giả sử nếu ta duyệt mảng và có **2, 5, 1** có XOR là 0 thì có bao nhiêu triplet có thể tạo ra từ tập đó?
- Trong trường hợp trên, (i, j, k) sẽ có vị trí như sau: i = 0, k = 2 (cố định) còn j sẽ có thể bằng 1 hoặc 2 (vì i < j <= k)
=> Có thể thấy, số triplet có thể tạo ra là **k - i**.
- Tóm lại, trong khoảng (i, k) ta tính được XOR của tất cả phần tử là 0 => ta chỉ cần tính số triplet tạo ra được trong khoảng (i, k) đó.
### Độ phức tạp thuật toán
Thời gian: $O(N^2)$
Bộ nhớ: $O(1)$
### Code tham khảo
```python
def countTriplets(self, arr: List[int]) -> int:
n = len(arr)
res = 0
for i in range(n - 1):
cur_op = arr[i]
for k in range(i + 1, n):
cur_op ^= arr[k]
if cur_op == 0:
res += (k - i)
return res
```