Number of unique triplets whose XOR is zero - GeeksforGeeks

21 May, 2021
Given N numbers with no duplicates, count the number of unique triplets (ai, aj, ak) such that their XOR is 0. A triplet is said to be unique if all of the three numbers in the triplet are unique. 
Examples: 
Input : a[] = {1, 3, 5, 10, 14, 15};
Output : 2 
Explanation : {1, 14, 15} and {5, 10, 15} are the 
              unique triplets whose XOR is 0. 
              {1, 14, 15} and all other combinations of 
              1, 14, 15 are considered as 1 only.

Input : a[] = {4, 7, 5, 8, 3, 9};
Output : 1
Explanation : {4, 7, 3} is the only triplet whose XOR is 0 
Naive Approach: A naive approach is to run three nested loops, the first runs from 0 to n, the second from i+1 to n, and the last one from j+1 to n to get the unique triplets. Calculate the XOR of ai, aj, ak, check if it equals 0. If so, then increase the count. Time Complexity: O(n3)
Efficient Approach: An efficient approach is to use one of the properties of XOR: the XOR of two of the same numbers gives 0. So we need to calculate the XOR of unique pairs only, and if the calculated XOR is one of the array elements, then we get the triplet whose XOR is 0. Given below are the steps for counting the number of unique triplets:Below is the complete algorithm for this approach:  
With the map, mark all the array elements.Run two nested loops, one from i-n-1, and the other from i+1-n to get all the pairs.Obtain the XOR of the pair.Check if the XOR is an array element and not one of ai or aj.Increase the count if the condition holds.Return count/3 as we only want unique triplets. Since i-n and j+1-n give us unique pairs but not triplets, we do a count/3 to remove the other two possible combinations.
With the map, mark all the array elements.
Run two nested loops, one from i-n-1, and the other from i+1-n to get all the pairs.
Obtain the XOR of the pair.
Check if the XOR is an array element and not one of ai or aj.
Increase the count if the condition holds.
Return count/3 as we only want unique triplets. Since i-n and j+1-n give us unique pairs but not triplets, we do a count/3 to remove the other two possible combinations.
Below is the implementation of the above idea:  
C++
Java
Python3
C#
Javascript
// CPP program to count the number of// unique triplets whose XOR is 0#include <bits/stdc++.h>using namespace std; // function to count the number of// unique triplets whose xor is 0int countTriplets(int a[], int n){    // To store values that are present    unordered_set<int> s;    for (int i = 0; i < n; i++)        s.insert(a[i]);         // stores the count of unique triplets    int count = 0;         // traverse for all i, j pairs such that j>i    for (int i = 0; i < n-1; i++) {        for (int j = i + 1; j < n; j++) {           // xor of a[i] and a[j]          int xr = a[i] ^ a[j];               // if xr of two numbers is present,          // then increase the count          if (s.find(xr) != s.end() && xr != a[i] &&                                       xr != a[j])            count++;        }    }         // returns answer    return count / 3;} // Driver code to test above functionint main(){    int a[] = {1, 3, 5, 10, 14, 15};    int n = sizeof(a) / sizeof(a[0]);      cout << countTriplets(a, n);       return 0;}
// Java program to count// the number of unique// triplets whose XOR is 0import java.io.*;import java.util.*; class GFG{    // function to count the    // number of unique triplets    // whose xor is 0    static int countTriplets(int []a,                             int n)    {        // To store values        // that are present        ArrayList<Integer> s =                  new ArrayList<Integer>();        for (int i = 0; i < n; i++)            s.add(a[i]);                 // stores the count        // of unique triplets        int count = 0;                 // traverse for all i,        // j pairs such that j>i        for (int i = 0; i < n; i++)        {            for (int j = i + 1;                     j < n; j++)            {                 // xor of a[i] and a[j]            int xr = a[i] ^ a[j];                     // if xr of two numbers            // is present, then            // increase the count            if (s.contains(xr) &&                xr != a[i] && xr != a[j])                count++;            }        }                 // returns answer        return count / 3;    }         // Driver code    public static void main(String srgs[])    {        int []a = {1, 3, 5,                   10, 14, 15};        int n = a.length;        System.out.print(countTriplets(a, n));    }} // This code is contributed by// Manish Shaw(manishshaw1)
# Python 3 program to count the number of# unique triplets whose XOR is 0 # function to count the number of# unique triplets whose xor is 0def countTriplets(a, n):         # To store values that are present    s = set()    for i in range(n):        s.add(a[i])         # stores the count of unique triplets    count = 0         # traverse for all i, j pairs such that j>i    for i in range(n):        for j in range(i + 1, n, 1):                         # xor of a[i] and a[j]            xr = a[i] ^ a[j]                         # if xr of two numbers is present,            # then increase the count            if (xr in s and xr != a[i] and                            xr != a[j]):                count += 1;             # returns answer    return int(count / 3) # Driver codeif __name__ == '__main__':    a = [1, 3, 5, 10, 14, 15]    n = len(a)    print(countTriplets(a, n))     # This code is contributed by# Surendra_Gangwar
// C# program to count// the number of unique// triplets whose XOR is 0using System;using System.Collections.Generic; class GFG{    // function to count the    // number of unique triplets    // whose xor is 0    static int countTriplets(int []a,                             int n)    {        // To store values        // that are present        List<int> s = new List<int>();        for (int i = 0; i < n; i++)            s.Add(a[i]);                 // stores the count        // of unique triplets        int count = 0;                 // traverse for all i,        // j pairs such that j>i        for (int i = 0; i < n; i++)        {            for (int j = i + 1;                     j < n; j++)            {                 // xor of a[i] and a[j]            int xr = a[i] ^ a[j];                     // if xr of two numbers            // is present, then            // increase the count            if (s.Exists(item => item == xr) &&                   xr != a[i] && xr != a[j])                count++;            }        }                 // returns answer        return count / 3;    }         // Driver code    static void Main()    {        int []a = new int[]{1, 3, 5,                            10, 14, 15};        int n = a.Length;        Console.Write(countTriplets(a, n));    }} // This code is contributed by// Manish Shaw(manishshaw1)
<script>    // javascript program to count    // the number of unique    // triplets whose XOR is 0     // function to count the    // number of unique triplets    // whose xor is 0    function countTriplets(a , n) {        // To store values        // that are present        var s = [];        for (i = 0; i < n; i++)            s.push(a[i]);         // stores the count        // of unique triplets        var count = 0;         // traverse for all i,        // j pairs such that j>i        for (i = 0; i < n; i++) {            for (j = i + 1; j < n; j++) {                 // xor of a[i] and a[j]                var xr = a[i] ^ a[j];                 // if xr of two numbers                // is present, then                // increase the count                if (s.includes(xr) && xr != a[i] && xr != a[j])                    count++;            }        }         // returns answer        return count / 3;    }     // Driver code    var a = [ 1, 3, 5, 10, 14, 15 ];    var n = a.length;    document.write(countTriplets(a, n)); // This code contributed by Rajput-Ji</script>
Output: 
2
Time Complexity: O(n2) 
manishshaw1
SURENDRA_GANGWAR
yepitsme
Rajput-Ji
Bitwise-XOR
cpp-unordered_set
Arrays
Bit Magic
Searching
Arrays
Searching
Bit Magic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Stack Data Structure (Introduction and Program)
Top 50 Array Coding Problems for Interviews
Introduction to Arrays
Multidimensional Arrays in Java
Linear Search
Bitwise Operators in C/C++
Left Shift and Right Shift Operators in C/C++
Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
Count set bits in an integer
Cyclic Redundancy Check and Modulo-2 Division