【问题标题】:sum of XOR on all combinations of values of two subsets两个子集的所有值组合的 XOR 和
【发布时间】:2021-07-19 19:45:56
【问题描述】:

假设我有两个整数数组 a 和 b,每个数组都有 n 个整数。 我想知道两个不同子集中两个整数的所有组合的异或之和。

例如, if n == 3: 我想知道的价值:

a1^b1 + a1^b2 + a1^b3 + a2^b1 + a2^b2 + a2^b3 + a3^b1 + a3^b2 + a3^b3

有没有一种方法可以像使用 + 和 x 一样有效地做到这一点

i.e. 1*2 + 1*3 + 2*2 + 2*3 = (1+2)*(2+3)

【问题讨论】:

标签: algorithm xor


【解决方案1】:

如果数组中只有一个非零值,则有一个公式有效。因此,您可以一次执行一个位值,然后将每个位值的结果相加。

如果您知道 a 包含 x 个 1 和 nx 个零,并且 b 包含 y 个 1 和 ny 0 个,那么每个 a^b 要么是 1 要么是 0,而 1 的个数正好是 x * (ny) + y * (nx).

如果在子集中隔离 1 位,则可以计算在 XOR 对中设置了多少个 1 位。同样,如果隔离 2 位,则可以计算在 XOR 对中设置了多少 2 位。将每个位值的结果相加得出最终答案:

int total = 0;
for (int bit=1; bit>0 && (bit  < a.length || bit < b.length); bit<<=1) {
    int acount = 0;
    for (int val : a) {
        acount += val & bit;
    }
    acount /= bit;
    int bcount = 0;
    for (int val: b) {
        bcount += val & bit;
    }
    bcount /= bit;
    total += bit * ( acount * (b.length-bcount) + bcount * (a.length-acount) );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 2018-07-08
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多