1442. Count Triplets That Can Form Two Arrays of Equal XOR

https://leetcode.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/

Given an array of integers arr.

We want to select three indices i, j and k where (0 <= i < j <= k < arr.length).

Let's define a and b as follows:

  • a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]

  • b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]

Note that ^ denotes the bitwise-xor operation.

Return the number of triplets (i, j and k) Where a == b.

Example 1:

Input: arr = [2,3,1,6,7]
Output: 4
Explanation: The triplets are (0,1,2), (0,2,2), (2,3,4) and (2,4,4)

Example 2:

Input: arr = [1,1,1,1,1]
Output: 10

Example 3:

Input: arr = [2,3]
Output: 0

Example 4:

Input: arr = [1,3,5,7,9]
Output: 3

Example 5:

Input: arr = [7,11,12,9,5,2,7,17,22]
Output: 8

Constraints:

  • 1 <= arr.length <= 300

  • 1 <= arr[i] <= 10^8

对给定数组arr问三元组(i, j, k)满足xor(arr[i:j]) == xor(arr[j:k))的三元组个数。xor(arr[i:j]) == xor(arr[j:k))意味着xor(arr[i:j]) ^ xor(arr[j:k)) == xor(arr[i:j]) == 0,此时对k,遍历i,当prexor[i-1] ^ prexor[k] == 0时,意味着对i,k,能和中间的所有j组成满足条件的三元组,res += k - i,总时间复杂度O(N^2);进一步因为prexor[i-1] ^ prexor[k] == 0时,prexor[i - 1] == prexor[k],所以可以统计每次prexor[k]出现的频率和sum(出现的index),也就是i-1的位置和,res += k - i for all i => res += freq(prexor[k]) * (k - 1) - (sum(i - 1) for all i that prexor[i - 1] == prexor[k]),初始时还有值0对应的位置-1和频率1,总时间复杂度O(N)。

class Solution:
    def countTriplets(self, arr: List[int]) -> int:
        prexor, cur, res = {0: [1, -1]}, 0, 0
        for k, v in enumerate(arr):
            cur ^= v
            if cur not in prexor:
                prexor[cur] = [0, 0]
            f, t = prexor[cur]
            res += (k - 1) * f - t
            prexor[cur] = [f + 1, t + k]
        return res
                

Last updated