关于集合问题的小trick

1.枚举子集:

很多oi题目中都要求枚举子集,据说枚举子集的复杂度是n^3的,下面给出简要的证明(摘抄)

【对于这种连续的枚举子集问题,复杂度其实是O(3n)O(3n)
对于每个数位,只有3种情况,原本是0,原本是1枚举子集成0,原本是1枚举子集成1
当然这种复杂度的前提是精准找到那个位置

反正我还没想明白

关于枚举子集的小技巧:

for(int x=s;x;x=(x-1)&s)下面给出解释(摘抄):

【x = (x-1)&S实际上是把S中的0全部忽略,并不断减1的结果,比如S=1011,则x分别为:1011, 1010, 1001, 1000, 0011, 0010, 0001。忽略S中第二位的0其实就是111, 110, 101, 100, 011, 010, 001。

称S中的1所在位为有效位,0所在位为无效位,则x中的无效位必为0,有效位为0或1,比如S=1011,x=1001(有效位加下划线)。-1就是加上-1补码1111…,可以想成把无效位的1先加上去,比如x=1001变成1101,再加有效位的1。由于无效位加完肯定是1,会把有效位的进位“传递”下去,然后再位与S使得无效位变成0,实际就相当于有效位加上1111…,也就是有效位-1。】

所以,乍一看是n^2的???

posted @ 2020-02-16 08:47  Tj1  阅读(148)  评论(0编辑  收藏  举报