码迷,mamicode.com
首页 > 其他好文 > 详细

二进制表示集合

时间:2020-02-01 23:28:45      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:判断   inline   元素   code   交集   表示   集合   block   math   

二进制表示集合

  • 空集:0
  • 只有第 i 个元素的集合:1<<i
  • 含有全部 n 个元素的集合:(1<<n)-1
  • 判断第 i 个元素是否属于集合 S:if(S>>i&1)
  • 向集合中加入第 i 个元素:S|1<<i
  • 从集合中去除第 i 个元素:S&~(1<<i)
  • 集合 S 和 T 的并集:S|T
  • 集合 S 和 T 的交集:S&T

枚举\(\{0,1,...,n-1\}\)的所有子集:

for(int S=0;S<1<<n;S++){
    //对子集的处理
}

枚举 sup 的所有子集:

int sub=sup;
do{
    //对子集的处理
    sub=(sub-1)&sup;  
}while(sub!=sup); //-1&sup=sup结束循环

枚举\(\{0,1,...,n-1\}\)的所有子集大小为 k 的集合的方法:

int comb=(1<<k)-1;
while(comb<1<<n){
    //对集合的处理
    int x=comb&-comb,y=comb+x;
    comb=((comb&~y)/x>>1)|y;
}

x&(-x)的值就是将其最低位的1独立出来后的值

y=comb+x就是将 comb 从最低位的1开始的连续的1都置0了

z=comb&-y得到了最低位1开始的连续区间

z/x可以将 z 不断右移,直到最低位为1

二进制表示集合

标签:判断   inline   元素   code   交集   表示   集合   block   math   

原文地址:https://www.cnblogs.com/CADCADCAD/p/12250311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!