数组的Xor和

时间:2015-03-01 15:02:25

标签: algorithm

有N种不同的颜色。每种颜色都有不同的强度值N [i](1≤i≤N)。 爱丽丝想要混合她可用的所有颜色,并用可用的颜色制作新的颜色。

混合被定义为这样一个过程,在这个过程中,她将每种颜色的XOR与其他可用的颜色一起使用,然后将它们全部添加以获得所得颜色的强度。

示例:设N = 2,颜色为[4,5],此处答案为1。

请解释如何处理此问题

1 ≤ N ≤ 10^6
1 ≤ N[i] ≤ 2^32

显然,我无法以各种方式行事。

1 个答案:

答案 0 :(得分:1)

  1. 让我们独立解决每个位的问题。

  2. 对于固定位b,我们可以计算i和位j所在的i > jb对的数量使用此伪代码表示的算法在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

  3. 所以解决方案是:迭代从032的所有位,并为每个位运行所述的算法。

  4. 时间复杂度为O(N * log MAX_VALUE),对于给定的约束条件看起来很好。