给定一个由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 ,使每个元素的位数等于最大位数。
- 查找给定数组的所有子序列。
- 找出具有 Binary Equivalence的子序列的总数。
- 如果总数的长度小于最大数的长度,则将总数转换为二进制并附加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 maximum 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 maximum 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 )
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。