两个子集值的所有组合的 XOR 之和
sum of XOR on all combinations of values of two subsets
假设我有两个整数数组 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 个和 n-x 个零,并且 b 包含 y 个和 n-y 个零,然后每个 a^b不是1就是0,1的个数正好是x * (n-y) + y * (n-x).
如果将子集中的 1 位隔离开来,则可以计算异或对中设置了多少个 1 位。类似地,如果您隔离 2 位,则可以计算异或对中设置了多少个 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) );
}
假设我有两个整数数组 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 个和 n-x 个零,并且 b 包含 y 个和 n-y 个零,然后每个 a^b不是1就是0,1的个数正好是x * (n-y) + y * (n-x).
如果将子集中的 1 位隔离开来,则可以计算异或对中设置了多少个 1 位。类似地,如果您隔离 2 位,则可以计算异或对中设置了多少个 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) );
}