# Count triplet of indices (i, j, k) such that XOR of elements between [i, j) equals [j, k]

Given an array of integers **Arr**. The task is to count the number of triplets **(i, j, k)** such that **A _{i} ^ A_{i+1} ^ A_{i+2} ^ …. ^ A_{j-1} = A_{j} ^ A_{j+1} ^ A_{j+2} ^ ….. ^ A_{k}**, and

**0 < (i, j, k) < N**, where

**N**is the size of the array.

Where

**^**is the

**bitwise xor**of two numbers.

**Examples:**

Input:Arr = [5, 2, 7]Output:2Explanation:

The triplets are (0, 2, 2) since 5 ^ 2 = 7 and (0, 1, 2) since 2 ^ 7 = 5.Input:Arr = [3, 6, 12, 8, 6, 2, 1, 5]Output:6

**Approach**

- Let’s simplify the given expression :

A_{i}^ A_{i + 1}^ ...A_{j - 1}= A_{j}^ A_{j + 1}^ ...A_{k}Taking XOR with A_{j}^ A_{j + 1}^ ...A_{k}on both sides A_{i}^ A_{i + 1}^ ...A_{j - 1}^ A_{j}^ A_{j + 1}^ ...A_{k}= 0

- So a subarray [i, k] having XOR 0 will have
**k – i**triplets, because any j can be selected from [i+1, k] and the triplet will satisfy the condition.

- The problem now reduces to finding lengths of all subarray whose XOR is 0 and for each such length L, add L – 1 to the answer.

- In the prefix XOR array if at 2 indices, say L and R, the prefix XOR value is same – then it means that the XOR of subarray [L + 1, R] = 0.

- To find the count, we will store the following :

Say we are at index i, and the prefix XOR at i = x. count[x] = Frequency of x in prefix XOR array before i ways[x] -> For each all j < i, if prefixXor[j] = x, then ways[x] += (j+1)

- These can be used to count the triplets using the formula :

Triplets += count[x] * i - ways[x]

Below is the implementation of the above approach:

## C++

`// C++ program to count the Number of` `// triplets in array having subarray` `// XOR equal` `#include <bits/stdc++.h>` `using` `namespace` `std;` `// Function return the count of` `// triplets having subarray XOR equal` `int` `CountOfTriplets(` `int` `a[], ` `int` `n)` `{` ` ` `int` `answer = 0;` ` ` `// XOR value till i` ` ` `int` `x = 0;` ` ` `// Count and ways array as defined` ` ` `// above` ` ` `int` `count[100005] = { 0 };` ` ` `int` `ways[100005] = { 0 };` ` ` `for` `(` `int` `i = 0; i < n; i++)` ` ` `{` ` ` `x ^= a[i];` ` ` `// Using the formula stated` ` ` `answer += count[x] * i - ways[x];` ` ` `// Increase the frequency of x` ` ` `count[x]++;` ` ` `// Add i+1 to ways[x] for upcoming` ` ` `// indices` ` ` `ways[x] += (i + 1);` ` ` `}` ` ` `return` `answer;` `}` `// Driver code` `int` `main()` `{` ` ` `int` `Arr[] = { 3, 6, 12, 8, 6, 2, 1, 5 };` ` ` `int` `N = ` `sizeof` `(Arr) / ` `sizeof` `(Arr[0]);` ` ` `cout << CountOfTriplets(Arr, N);` ` ` `return` `0;` `}` |

## Java

`// Java program to count the Number of` `// triplets in array having subarray` `// XOR equal` `import` `java.io.*;` `import` `java.util.Arrays;` `import` `java.util.ArrayList;` `import` `java.lang.*;` `import` `java.util.Collections;` `class` `GFG` `{` `// Function return the count of` `// triplets having subarray XOR equal` `static` `int` `CountOfTriplets(` `int` `a[], ` `int` `n)` `{` ` ` `int` `answer = ` `0` `;` ` ` `// XOR value till i` ` ` `int` `x = ` `0` `;` ` ` `// Count and ways array as defined` ` ` `// above` ` ` `int` `count[] = ` `new` `int` `[` `100005` `];` ` ` `int` `ways[] = ` `new` `int` `[` `100005` `];` ` ` ` ` `for` `(` `int` `i = ` `0` `; i < n; i++)` ` ` `{` ` ` `x ^= a[i];` ` ` `// Using the formula stated` ` ` `answer += count[x] * i - ways[x];` ` ` `// Increase the frequency of x` ` ` `count[x]++;` ` ` `// Add i+1 to ways[x] for upcoming` ` ` `// indices` ` ` `ways[x] += (i + ` `1` `);` ` ` `}` ` ` `return` `answer;` `}` `// Driver code` `public` `static` `void` `main(String[] args)` `{` ` ` `int` `Arr[] = { ` `3` `, ` `6` `, ` `12` `, ` `8` `, ` `6` `, ` `2` `, ` `1` `, ` `5` `};` ` ` `int` `N = Arr.length;` ` ` `System.out.print(CountOfTriplets(Arr, N));` `}` `}` `// This code is contributed by shivanisinghss2110` |

## Python3

`# Python3 program to count the Number of` `# triplets in array having subarray` `# XOR equal` `# Function return the count of` `# triplets having subarray XOR equal` `def` `CountOfTriplets(a,n):` ` ` `answer ` `=` `0` ` ` `# XOR value till i` ` ` `x ` `=` `0` ` ` `# Count and ways array as defined` ` ` `# above` ` ` `count ` `=` `[` `0` `for` `i ` `in` `range` `(` `100005` `)]` ` ` `ways ` `=` `[` `0` `for` `i ` `in` `range` `(` `100005` `)]` ` ` `for` `i ` `in` `range` `(n):` ` ` `x ^` `=` `a[i]` ` ` `# Using the formula stated` ` ` `answer ` `+` `=` `count[x] ` `*` `i ` `-` `ways[x]` ` ` `# Increase the frequency of x` ` ` `count[x] ` `+` `=` `1` ` ` `# Add i+1 to ways[x] for upcoming` ` ` `# indices` ` ` `ways[x] ` `+` `=` `(i ` `+` `1` `)` ` ` `return` `answer` `# Driver code` `if` `__name__ ` `=` `=` `'__main__'` `:` ` ` `Arr ` `=` `[` `3` `, ` `6` `, ` `12` `, ` `8` `, ` `6` `, ` `2` `, ` `1` `, ` `5` `]` ` ` `N ` `=` `len` `(Arr)` ` ` `print` `(CountOfTriplets(Arr, N))` `# This code is contributed by Bhupendra_Singh` |

## C#

`// C# program to count the Number of` `// triplets in array having subarray` `// XOR equal` `using` `System;` `class` `GFG {` `// Function return the count of` `// triplets having subarray XOR equal` `static` `int` `CountOfTriplets(` `int` `[]a, ` `int` `n)` `{` ` ` `int` `answer = 0;` ` ` `// XOR value till i` ` ` `int` `x = 0;` ` ` `// Count and ways array as defined` ` ` `// above` ` ` `int` `[]count = ` `new` `int` `[100005];` ` ` `int` `[]ways = ` `new` `int` `[100005];` ` ` ` ` `for` `(` `int` `i = 0; i < n; i++)` ` ` `{` ` ` `x ^= a[i];` ` ` ` ` `// Using the formula stated` ` ` `answer += count[x] * i - ways[x];` ` ` ` ` `// Increase the frequency of x` ` ` `count[x]++;` ` ` ` ` `// Add i+1 to ways[x] for upcoming` ` ` `// indices` ` ` `ways[x] += (i + 1);` ` ` `}` ` ` ` ` `return` `answer;` `}` `// Driver code` `public` `static` `void` `Main(String[] args)` `{` ` ` `int` `[]Arr = { 3, 6, 12, 8, 6, 2, 1, 5 };` ` ` `int` `N = Arr.Length;` ` ` `Console.Write(CountOfTriplets(Arr, N));` `}` `}` `// This code is contributed by Rohit_ranjan` |

## Javascript

`<script>` ` ` `// Javascript program to count the Number of` ` ` `// triplets in array having subarray` ` ` `// XOR equal` ` ` ` ` `// Function return the count of` ` ` `// triplets having subarray XOR equal` ` ` `function` `CountOfTriplets(a, n)` ` ` `{` ` ` `let answer = 0;` ` ` `// XOR value till i` ` ` `let x = 0;` ` ` `// Count and ways array as defined` ` ` `// above` ` ` `let count = ` `new` `Array(100005);` ` ` `let ways = ` `new` `Array(100005);` ` ` `count.fill(0);` ` ` `ways.fill(0);` ` ` `for` `(let i = 0; i < n; i++)` ` ` `{` ` ` `x ^= a[i];` ` ` `// Using the formula stated` ` ` `answer += count[x] * i - ways[x];` ` ` `// Increase the frequency of x` ` ` `count[x]++;` ` ` `// Add i+1 to ways[x] for upcoming` ` ` `// indices` ` ` `ways[x] = ways[x] + i + 1;` ` ` `}` ` ` `return` `answer;` ` ` `}` ` ` ` ` `let Arr = [ 3, 6, 12, 8, 6, 2, 1, 5 ];` ` ` ` ` `let N = Arr.length;` ` ` ` ` `document.write(CountOfTriplets(Arr, N));` `</script>` |

**Output:**

6

**Time Complexity :** O(N)