【问题标题】:Number of subsets whose XOR contains less than two set bitsXOR 包含少于两个集合位的子集数
【发布时间】:2020-03-26 11:14:11
【问题描述】:

我有一个数组 A(大小

我有一种方法,我使用 DP 来计算给定范围,如下所示: https://www.geeksforgeeks.org/count-number-of-subsets-having-a-particular-xor-value/

但这显然太慢了。这感觉像是一个经典的线段树问题,但似乎无法找到每个节点要存储哪些数据点,因此我可以使用左孩子和右孩子来计算给定范围的答案。

【问题讨论】:

  • 请提供一个例子。当你说“子集”时,你到底是什么意思?如果范围是[2, 10],那么[3,4,5] 是一个子集吗? [2,4,6,8] 是子集吗?

标签: algorithm subset dynamic-programming xor segment-tree


【解决方案1】:

是的,那个 DP 不够快。

在 GF(2)(具有两个元素的伽罗瓦域)上应用一些线性代数会足够快。每个数字都可以解释为一个位向量;加/减向量是异或;标量乘法并不真正相关。

每个段需要的数据是 (1) 段中有多少个数字 (2) 段中的数字生成的数字子空间的基础,该子空间最多包含 27 个数字,因为所有数字小于 2^27。如果它不为零,则单元素段的基础就是那个数字,否则就是空集。要找到两个基并集的跨度,请使用高斯消元法并丢弃零向量。

给定区间的长度和它的基,您可以使用秩零定理计算好的子集的数量。基本上,对于每个目标数,使用您的高斯消除例程来测试目标数是否属于子空间。如果是这样,则有 2^(区间长度减去基础大小)子集。如果不是,答案是零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多