Related Articles
Count of subsequences from a given Array having Binary Equivalence
• Last Updated : 04 Sep, 2020

Given an array arr[] consisting of N integers, the task is to find the total number of distinct subsequences having Binary Equivalence.

A subsequence has Binary Equivalence if the sum of the count of set and unset bits in the binary representations of all the decimal numbers across the subsequence are equal.

Examples:

Input: arr[] = {2, 7, 10}
Output: 0011
Explanation:
2 → 0010→1’s = 1, 0’s = 3
7 → 0111→1’s = 3, 0’s = 1
10 → 1010→1’s = 2, 0’s = 2
The subsequence [2, 7, 10] has Binary Equivalence because the number of 0’s and 1’s across the subsequence is 6 each.
Similarly, [2, 7] also has Binary Equivalence of 4 each.
But [7, 10] does not have Binary Equivalence.
Likewise,  has Binary Equivalence of 2 each.
The total number of unique subsequences where Binary Equivalence is possible is 3.
Since 10 is the largest element in the given array and the number of bits required to represent 10 in binary is 4. Hence, the number of bits present in the output needs to be 4.

Input: arr[] = {5, 7, 9, 12}
Output: 0111

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: The idea is to find the total number of bits required to represent the maximum element of the array.Follow these steps to solve this problem:

1. Find the maximum element and the length of binary representation of the maximum element.
2. Append 0 in the front other elements in binary representation, to make the number of bits in each element equal to the maximum number bits.
3. Find all the subsequences of the given array.
4. Find the total number of subsequences that have Binary Equivalence.
5. Convert the total number into binary and append 0s if the length of the total number is less than the length of the maximum number to make both the lengths equal.

Below is the implementation of the above approach:

## Python3

 `# Python program for the above approach``import` `itertools`` ` `# Function to find the number of``# subsequences having Binary Equivalence``def` `numberOfSubsequence(arr):`` ` `    ``# Find the maximum array element``    ``Max_element ``=` `max``(arr)`` ` `    ``# Convert the maximum element``    ``# to its binary equivalent``    ``Max_Binary ``=` `"{0:b}"``.``format``(``int``(``        ``Max_element))`` ` `    ``# Dictionary to store the count of``    ``# set and unset bits of all array elements``    ``Dic ``=` `{}`` ` `    ``for` `i ``in` `arr:``        ``Str` `=` `"{0:b}"``.``format``(``int``(i))`` ` `        ``if` `len``(``Str``) <``=` `len``(Max_Binary):``            ``diff ``=` `len``(Max_Binary)``-``len``(``Str``)`` ` `            ``# Add the extra zeros before all``            ``# the elements which have length``            ``# smaller than the maximun element``            ``Str` `=` `(``'0'``*``diff)``+``Str`` ` `        ``zeros ``=` `Str``.count(``'0'``)``        ``ones ``=` `Str``.count(``'1'``)`` ` `        ``# Fill the dictionary with number``        ``# of 0's and 1's``        ``Dic[``int``(i)] ``=` `[zeros, ones]`` ` `    ``all_combinations ``=` `[]`` ` `    ``# Find all the combination``    ``for` `r ``in` `range``(``len``(arr)``+``1``):`` ` `        ``comb ``=` `itertools.combinations(arr, r)``        ``comlist ``=` `list``(comb)``        ``all_combinations ``+``=` `comlist``    ``count ``=` `0`` ` `    ``# Find all the combinations where``    ``# sum_of_zeros == sum_of_ones``    ``for` `i ``in` `all_combinations[``1``:]:``        ``sum0 ``=` `0``        ``sum1 ``=` `0``        ``for` `j ``in` `i:``            ``sum0 ``+``=` `Dic[j][``0``]``            ``sum1 ``+``=` `Dic[j][``1``]`` ` `        ``# Count the total combinations``        ``# where sum_of_zeros = sum_of_ones``        ``if` `sum0 ``=``=` `sum1:``            ``count ``+``=` `1`` ` `    ``# Convert the count number to its``    ``# binary equivalent``    ``Str` `=` `"{0:b}"``.``format``(``int``(count))``    ``if` `len``(``Str``) <``=` `len``(Max_Binary):``        ``diff ``=` `len``(Max_Binary)``-``len``(``Str``)`` ` `        ``# Append leading zeroes to``        ``# the answer if its length is``        ``# smaller than the maximun element``        ``Str` `=` `(``'0'``*``diff) ``+` `Str`` ` `    ``# Print the result``    ``print``(``Str``)`` ` ` ` `# Driver Code`` ` `# Give array arr[]``arr ``=` `[``5``, ``7``, ``9``, ``12``]`` ` `# Function Call``numberOfSubsequence(arr)`
Output:
```0111
```

Time Complexity: O(2N)
Auxiliary Space: O(N2)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up