Count pairs in an array such that both elements has equal set bits
Last Updated :
03 Jan, 2023
Given an array arr [] of size N with unique elements, the task is to count the total number of pairs of elements that have equal set bits count.
Examples:
Input: arr[] = {2, 5, 8, 1, 3}
Output: 4
Set bits counts for {2, 5, 8, 1, 3} are {1, 2, 1, 1, 2}
All pairs with same set bits count are {2, 8}, {2, 1}, {5, 3}, {8, 1}
Input: arr[] = {1, 11, 7, 3}
Output: 1
Only possible pair is {11, 7}
Approach:
- Traverse the array from left to right and count total number of set bits of each integer.
- Use a map to store the number of elements with same count of set bits with set bits as key, and count as value.
- Then iterator through map elements, and calculate how many two-element pairs can be formed from n elements (for each element of the map) i.e. (n * (n-1)) / 2.
- The final result will be the sum of output from the previous step for every element of the map.
Below is the implementation of the above approach:
C++
// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
// Function to count all pairs
// with equal set bits count
int totalPairs(int arr[], int n)
{
// map to store count of elements
// with equal number of set bits
map<int, int> m;
for (int i = 0; i < n; i++) {
// inbuilt function that returns the
// count of set bits of the number
m[__builtin_popcount(arr[i])]++;
}
map<int, int>::iterator it;
int result = 0;
for (it = m.begin(); it != m.end(); it++) {
// there can be (n*(n-1)/2) unique two-
// element pairs to choose from n elements
result
+= (*it).second * ((*it).second - 1) / 2;
}
return result;
}
// Driver code
int main()
{
int arr[] = { 7, 5, 3, 9, 1, 2 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << totalPairs(arr, n);
return 0;
}
Java
import java.util.*;
class GFG {
/* Function to get no of set
bits in binary representation
of passed binary no. */
static int countSetBits(int n)
{
int count = 0;
while (n > 0)
{
n &= (n - 1) ;
count++;
}
return count;
}
// Function to count all pairs
// with equal set bits count
static int totalPairs(int arr[], int n)
{
// map to store count of elements
// with equal number of set bits
HashMap<Integer, Integer> m = new HashMap<>();
for (int i = 0; i < n; i++) {
// function that returns the
// count of set bits of the number
int count = countSetBits(arr[i]);
if(m.containsKey(count))
m.put(count, m.get(count) + 1);
else
m.put(count, 1);
}
int result = 0;
for (Map.Entry<Integer, Integer> entry : m.entrySet()) {
int value = entry.getValue();
// there can be (n*(n-1)/2) unique two-
// element pairs to choose from n elements
result += ((value * (value -1)) / 2);
}
return result;
}
public static void main (String[] args) {
int arr[] = { 7, 5, 3, 9, 1, 2 };
int n = arr.length;
System.out.println(totalPairs(arr, n));
}
}
Python3
# Python3 implementation of the above approach
# Function to count all pairs
# with equal set bits count
def totalPairs(arr, n):
# dictionary to store count of elements
# with equal number of set bits
m = dict()
for i in range(n):
# inbuilt function that returns the
# count of set bits of the number
x = bin(arr[i]).count('1')
m[x] = m.get(x, 0) + 1;
result = 0
for it in m:
# there can be (n*(n-1)/2) unique two-
# element pairs to choose from n elements
result+= (m[it] * (m[it] - 1)) // 2
return result
# Driver code
arr = [7, 5, 3, 9, 1, 2]
n = len(arr)
print(totalPairs(arr, n))
# This code is contributed by mohit kumar
C#
// C# program to rearrange a string so that all same
// characters become atleast d distance away
using System;
using System.Collections.Generic;
class GFG
{
/* Function to get no of set
bits in binary representation
of passed binary no. */
static int countSetBits(int n)
{
int count = 0;
while (n > 0)
{
n &= (n - 1) ;
count++;
}
return count;
}
// Function to count all pairs
// with equal set bits count
static int totalPairs(int []arr, int n)
{
// map to store count of elements
// with equal number of set bits
Dictionary<int,int> mp = new Dictionary<int,int>();
for (int i = 0 ; i < n; i++)
{
// function that returns the
// count of set bits of the number
int count = countSetBits(arr[i]);
if(mp.ContainsKey(count))
{
var val = mp[count];
mp.Remove(count);
mp.Add(count, val + 1);
}
else
{
mp.Add(count, 1);
}
}
int result = 0;
foreach(KeyValuePair<int, int> entry in mp){
int values = entry.Value;
// there can be (n*(n-1)/2) unique two-
// element pairs to choose from n elements
result += ((values * (values -1)) / 2);
}
return result;
}
// Driver code
public static void Main (String[] args)
{
int []arr = { 7, 5, 3, 9, 1, 2 };
int n = arr.Length;
Console.WriteLine(totalPairs(arr, n));
}
}
// This code is contributed by Princi Singh
JavaScript
<script>
// Javascript implementation of above approach
/* Function to get no of set
bits in binary representation
of passed binary no. */
function countSetBits(n)
{
var count = 0;
while (n > 0)
{
n &= (n - 1) ;
count++;
}
return count;
}
// Function to count all pairs
// with equal set bits count
function totalPairs(arr, n)
{
// map to store count of elements
// with equal number of set bits
var m = new Map();
for (var i = 0; i < n; i++) {
// inbuilt function that returns the
// count of set bits of the number
if(m.has(arr[i]))
{
m.set(countSetBits(arr[i]), m.get(countSetBits(arr[i]))+1);
}
else{
m.set(countSetBits(arr[i]), 1);
}
}
var result = 0;
m.forEach((value, key) => {
// there can be (n*(n-1)/2) unique two-
// element pairs to choose from n elements
result += parseInt(key * (key - 1) / 2);
});
return result;
}
// Driver code
var arr = [7, 5, 3, 9, 1, 2 ];
var n = arr.length;
document.write( totalPairs(arr, n));
</script>
Time Complexity: O(n log n), where n is the number of elements in given array
Auxiliary Space: O(n)
Similar Reads
Count pairs of elements such that number of set bits in their AND is B[i] Given two arrays A[] and B[] of N elements each. The task is to find the number of index pairs (i, j) such that i ? j and F(A[i] & A[j]) = B[j] where F(X) is the count of set bits in the binary representation of X.Examples: Input: A[] = {2, 3, 1, 4, 5}, B[] = {2, 2, 1, 4, 2} Output: 4 All possib
5 min read
Count pairs in an array having sum of elements with their respective sum of digits equal Given an array arr[] consisting of N positive integers, the task is to count the number of pairs in the array, say (a, b) such that sum of a with its sum of digits is equal to sum of b with its sum of digits. Examples: Input: arr[] = {1, 1, 2, 2}Output: 2Explanation:Following are the pairs that sati
8 min read
Count pairs of elements such that number of set bits in their OR is B[i] Given two arrays A[] and B[] of N elements each. The task is to find the number of index pairs (i, j) such that i ? j and F(A[i] | A[j]) = B[j] where F(X) is the count of set bits in the binary representation of X.Examples Input: A[] = {5, 3, 2, 4, 6, 1}, B[] = {2, 2, 1, 4, 2, 3} Output: 7 All possi
5 min read
Count pairs in Array such that their bitwise XOR has Kth right bit set Given an array arr[] of size N and an integer K, the task is to find the number of pairs in the array such that the Kth bit from the right of their bitwise XOR is set. Examples: Input: arr[] = {3, 13, 2, 9}, N = 4, K = 3Output: 4Explanation: The pairs that have the kth bit set in bitwise xor value a
11 min read
Partition an array into two subsets with equal count of unique elements Given an array arr[] consisting of N integers, the task is to partition the array into two subsets such that the count of unique elements in both the subsets is the same and for each element, print 1 if that element belongs to the first subset. Otherwise, print 2. If it is not possible to do such a
13 min read