有N种不同的颜色。每种颜色都有不同的强度值N [i](1≤i≤N)。 爱丽丝想要混合她可用的所有颜色,并用可用的颜色制作新的颜色。
混合被定义为这样一个过程,在这个过程中,她将每种颜色的XOR与其他可用的颜色一起使用,然后将它们全部添加以获得所得颜色的强度。
示例:设N = 2,颜色为[4,5],此处答案为1。
请解释如何处理此问题
1 ≤ N ≤ 10^6
1 ≤ N[i] ≤ 2^32
显然,我无法以各种方式行事。
答案 0 :(得分:1)
让我们独立解决每个位的问题。
对于固定位b
,我们可以计算i
和位j
所在的i > j
和b
对的数量使用此伪代码表示的算法在N[i] xor N[j]
中设置:
// The amount of numbers where the bit b is not set.
count0 = 0
// The amount of numbers where this bit is set.
count1 = 0
// The number of pairs (i, j): i > j and this bit is set in N[i] xor N[j]
pairsCount = 0
for i <- 0 ... n - 1:
if the bit b is set in N[i]:
// This number gives one when xored with a number in which
// this bit is not set.
pairsCount += count0
count1++
else
// This number gives one when xored with a number in which
// this bit is set.
pairsCount += count1
count0++
return pairsCount
当我们知道这些对的数量时,我们应该在答案中添加pairsCount * 2 ** b
。
所以解决方案是:迭代从0
到32
的所有位,并为每个位运行所述的算法。
时间复杂度为O(N * log MAX_VALUE)
,对于给定的约束条件看起来很好。