微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

两个子集的所有值组合的异或之和

如何解决两个子集的所有值组合的异或之和

假设我有两个整数数组 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)

解决方法

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

如果您知道 a 包含 x 个 1 和 nx 个零,并且 b 包含 y 1 和 ny 零,那么每个 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) );
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。