给定一个由N个整数组成的数组arr [] ,任务是查找具有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.
例子:
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, [10] 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
方法:想法是找到代表数组最大元素所需的总位数,请按照以下步骤解决此问题:
- 查找最大元素和最大元素的二进制表示形式的长度。
- 在二进制表示形式的其他元素前附加0 ,以使每个元素中的位数等于最大位数。
- 找到给定数组的所有子序列。
- 查找具有二元等效项的子序列总数。
- 将总数转换为二进制数,如果总数的长度小于最大数的长度,则将其附加0以使两个长度相等。
下面是上述方法的实现:
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)
0111
时间复杂度: O(2 N )
辅助空间: O(N 2 )