Count Triplets That Can Form Two Arrays of Equal XOR

medium bitwise prefix xor

Problem

Given an integer array arr, pick three indices with 0 ≤ i < j ≤ k < n. They cut out two adjacent pieces: a is the XOR of arr[i..j-1] and b is the XOR of arr[j..k]. Count how many triplets (i, j, k) make a == b.

The array has up to 300 elements, each between 1 and 10⁸.

Inputarr = [2,3,1,6,7]
Output4
Prefix XORs are [0,2,1,0,6,1]: prefix[0]=prefix[3] gives (0,1,2) and (0,2,2); prefix[2]=prefix[5] gives (2,3,4) and (2,4,4).

def count_triplets(arr):
    n = len(arr)
    prefix = [0] * (n + 1)
    for t in range(n):
        prefix[t + 1] = prefix[t] ^ arr[t]
    count = 0
    for i in range(n):
        for k in range(i + 1, n):
            if prefix[i] == prefix[k + 1]:
                count += k - i
    return count
function countTriplets(arr) {
  const n = arr.length;
  const prefix = new Array(n + 1).fill(0);
  for (let t = 0; t < n; t++) {
    prefix[t + 1] = prefix[t] ^ arr[t];
  }
  let count = 0;
  for (let i = 0; i < n; i++) {
    for (let k = i + 1; k < n; k++) {
      if (prefix[i] === prefix[k + 1]) count += k - i;
    }
  }
  return count;
}
int countTriplets(int[] arr) {
    int n = arr.length;
    int[] prefix = new int[n + 1];
    for (int t = 0; t < n; t++) {
        prefix[t + 1] = prefix[t] ^ arr[t];
    }
    int count = 0;
    for (int i = 0; i < n; i++) {
        for (int k = i + 1; k < n; k++) {
            if (prefix[i] == prefix[k + 1]) count += k - i;
        }
    }
    return count;
}
int countTriplets(vector<int>& arr) {
    int n = arr.size();
    vector<int> prefix(n + 1, 0);
    for (int t = 0; t < n; t++) {
        prefix[t + 1] = prefix[t] ^ arr[t];
    }
    int count = 0;
    for (int i = 0; i < n; i++) {
        for (int k = i + 1; k < n; k++) {
            if (prefix[i] == prefix[k + 1]) count += k - i;
        }
    }
    return count;
}
Time: O(n²) Space: O(n)