【发布时间】:2016-03-12 06:07:58
【问题描述】:
我有一个包含 10^5 个元素的数组,其中每个元素都在 [0, 1023] 中。 我必须找到一个数组的子集数,使得元素的 XOR 为 Q。(对于 Q>1023,答案是 0)。 我想出了这个 O(N*1024) 方法
for (int i = 1; i <= n; i++ )
{
int a = F[i];
for (int j = 0; j < 1024; j++ )
{
ways[i][j] = ways[i-1][j] + ways[i-1][j^a];
if (ways[i][j] >= mod)
ways[i][j] -= mod;
}
}
由于元素的范围最大为 1023,我可以维护一个 Frequency F[i] , 数组,将上述代码减少到 O(1024*1024)。
这可能吗,频率数组有用吗?
【问题讨论】:
-
子集是否必须有一定的大小?它们是由数组中的相邻元素组成的吗?
-
所以你有
F,它是一个介于 0 到 1,023 之间的随机数数组。您有Q,它是同一范围内的随机数。您想知道插入F[x]^F[y]的x、y 组合有多少可以等于Q?例如:如果F = [0,1,1,2,2,2,3,3,3,3]和Q = 3那么ways应该是10? (1*4 + 2*3) -
@m69 子集可以是任意大小
2^n子集是可能的 -
频率阵列会有所帮助,但这只是第一步。如果你发现一个集合 [x,y,z] 异或到 q,那么 [x,y,z,z,z] 和 [x,y,z,k,k] 和 [x,y,z ,k,k,k,k] 也是有效答案。但这仍然留下了在 2^1024 个可能的集合中找到 [x,y,z] 的任务,这是一个不切实际的大数字。要么有一个数学技巧来简化这个问题,要么你误解了这个问题。
标签: algorithm data-structures xor