Find number of pairs in an array such that their XOR is 0
Given an array of size N. Find the number of pairs (i, j) such that XOR = 0, and 1 <= i < j <= N.
Examples :
Input : A[] = {1, 3, 4, 1, 4}
Output : 2
Explanation : Index (0, 3) and (2, 4)
Input : A[] = {2, 2, 2}
Output : 3
First Approach : Sorting
XOR = 0 is only satisfied when . Therefore, we will first sort the array and then count the frequency of each element. By combinatorics, we can observe that if frequency of some element is then, it will contribute to the answer.
Below is the implementation of above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int calculate( int a[], int n)
{
sort(a, a + n);
int count = 1;
int answer = 0;
for ( int i = 1; i < n; i++) {
if (a[i] == a[i - 1])
count += 1;
else {
answer = answer + (count * (count - 1)) / 2;
count = 1;
}
}
answer = answer + (count * (count - 1)) / 2;
return answer;
}
int main()
{
int a[] = { 1, 2, 1, 2, 4 };
int n = sizeof (a) / sizeof (a[0]);
cout << calculate(a, n);
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
int cmpfunc( const void * a, const void * b)
{
return (*( int *)a - *( int *)b);
}
int calculate( int a[], int n)
{
qsort (a, n, sizeof ( int ), cmpfunc);
int count = 1;
int answer = 0;
for ( int i = 1; i < n; i++) {
if (a[i] == a[i - 1])
count += 1;
else {
answer = answer + (count * (count - 1)) / 2;
count = 1;
}
}
answer = answer + (count * (count - 1)) / 2;
return answer;
}
int main()
{
int a[] = { 1, 2, 1, 2, 4 };
int n = sizeof (a) / sizeof (a[0]);
printf ( "%d" , calculate(a, n));
return 0;
}
|
Java
import java.util.*;
class GFG {
static int calculate( int a[], int n)
{
Arrays.sort(a);
int count = 1 ;
int answer = 0 ;
for ( int i = 1 ; i < n; i++) {
if (a[i] == a[i - 1 ])
count += 1 ;
else {
answer = answer + (count * (count - 1 )) / 2 ;
count = 1 ;
}
}
answer = answer + (count * (count - 1 )) / 2 ;
return answer;
}
public static void main(String[] args)
{
int a[] = { 1 , 2 , 1 , 2 , 4 };
int n = a.length;
System.out.println(calculate(a, n));
}
}
|
Python3
def calculate(a) :
a.sort()
count = 1
answer = 0
for i in range ( 1 , len (a)) :
if a[i] = = a[i - 1 ] :
count + = 1
else :
answer = answer + count * (count - 1 ) / / 2
count = 1
answer = answer + count * (count - 1 ) / / 2
return answer
if __name__ = = '__main__' :
a = [ 1 , 2 , 1 , 2 , 4 ]
print (calculate(a))
|
C#
using System;
class GFG
{
static int calculate( int []a, int n)
{
Array.Sort(a);
int count = 1;
int answer = 0;
for ( int i = 1; i < n; i++)
{
if (a[i] == a[i - 1])
{
count += 1;
}
else
{
answer = answer + (count * (count - 1)) / 2;
count = 1;
}
}
answer = answer + (count * (count - 1)) / 2;
return answer;
}
public static void Main ()
{
int []a = { 1, 2, 1, 2, 4 };
int n = a.Length;
Console.WriteLine(calculate(a, n));
}
}
|
PHP
<?php
function calculate( $a , $n )
{
sort( $a );
$count = 1;
$answer = 0;
for ( $i = 1; $i < $n ; $i ++)
{
if ( $a [ $i ] == $a [ $i - 1])
{
$count += 1;
}
else
{
$answer = $answer + ( $count *
( $count - 1)) / 2;
$count = 1;
}
}
$answer = $answer + ( $count *
( $count - 1)) / 2;
return $answer ;
}
$a = array (1, 2, 1, 2, 4);
$n = count ( $a );
echo calculate( $a , $n );
?>
|
Javascript
<script>
function calculate(a, n)
{
a.sort();
let count = 1;
let answer = 0;
for (let i = 1; i < n; i++) {
if (a[i] == a[i - 1]){
count += 1;
}
else
{
answer = answer + Math.floor((count * (count - 1)) / 2);
count = 1;
}
}
answer = answer + Math.floor((count * (count - 1)) / 2);
return answer;
}
let a = [ 1, 2, 1, 2, 4 ];
let n = a.length;
document.write(calculate(a, n));
</script>
|
Time Complexity : O(N Log N)
Auxiliary Space: O(1), as no extra space is used
Second Approach: Hashing (Index Mapping)
Solution is handy, if we can count the frequency of each element in the array. Index mapping technique can be used to count the frequency of each element.
Below is the implementation of above approach :
C++
#include <bits/stdc++.h>
using namespace std;
int calculate( int a[], int n){
int *maximum = max_element(a, a + n);
int frequency[*maximum + 1] = {0};
for ( int i = 0; i < n; i++)
{
frequency[a[i]] += 1;
}
int answer = 0;
for ( int i = 0; i < (*maximum)+1; i++)
{
answer = answer + frequency[i] * (frequency[i] - 1) ;
}
return answer/2;
}
int main()
{
int a[] = {1, 2, 1, 2, 4};
int n = sizeof (a) / sizeof (a[0]);
cout << (calculate(a,n));
}
|
Java
import java.util.*;
class GFG
{
static int calculate( int a[], int n)
{
int maximum = Arrays.stream(a).max().getAsInt();
int frequency[] = new int [maximum + 1 ];
for ( int i = 0 ; i < n; i++)
{
frequency[a[i]] += 1 ;
}
int answer = 0 ;
for ( int i = 0 ; i < (maximum) + 1 ; i++)
{
answer = answer + frequency[i] * (frequency[i] - 1 );
}
return answer / 2 ;
}
public static void main(String[] args)
{
int a[] = { 1 , 2 , 1 , 2 , 4 };
int n = a.length;
System.out.println(calculate(a, n));
}
}
|
Python 3
def calculate(a) :
maximum = max (a)
frequency = [ 0 for x in range (maximum + 1 )]
for i in a :
frequency[i] + = 1
answer = 0
for i in frequency :
answer = answer + i * (i - 1 ) / / 2
return answer
a = [ 1 , 2 , 1 , 2 , 4 ]
print (calculate(a))
|
C#
using System;
using System.Linq;
class GFG
{
static int calculate( int []a, int n)
{
int maximum = a.Max();
int []frequency = new int [maximum + 1];
for ( int i = 0; i < n; i++)
{
frequency[a[i]] += 1;
}
int answer = 0;
for ( int i = 0; i < (maximum) + 1; i++)
{
answer = answer + frequency[i] *
(frequency[i] - 1);
}
return answer / 2;
}
public static void Main(String[] args)
{
int []a = {1, 2, 1, 2, 4};
int n = a.Length;
Console.WriteLine(calculate(a, n));
}
}
|
PHP
<?php
function calculate( $a , $n )
{
$maximum = max( $a );
$frequency = array_fill (0, $maximum + 1, 0);
for ( $i = 0; $i < $n ; $i ++)
{
$frequency [ $a [ $i ]] += 1;
}
$answer = 0;
for ( $i = 0; $i < ( $maximum ) + 1; $i ++)
{
$answer = $answer + $frequency [ $i ] *
( $frequency [ $i ] - 1);
}
return $answer / 2;
}
$a = array (1, 2, 1, 2, 4);
$n = count ( $a );
echo (calculate( $a , $n ));
?>
|
Javascript
<script>
function calculate(a, n){
let maximum = Math.max(...a);
let frequency = new Array(maximum + 1).fill(0);
for (let i = 0; i < n; i++)
{
frequency[a[i]] += 1;
}
let answer = 0;
for (let i = 0; i < maximum+1; i++)
{
answer = answer + frequency[i] * (frequency[i] - 1) ;
}
return parseInt(answer/2);
}
let a = [1, 2, 1, 2, 4];
let n = a.length;
document.write(calculate(a,n));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Note : Index Mapping method can only be used when the numbers in the array are not large. In such cases, sorting method can be used.
Last Updated :
01 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...