题单
78 . 子集
1178. 猜字谜
1601. 最多可达成的换楼请求数目
2151 . 基于陈述统计最多好人数
一些心得:
(1)找到某个公共状态进行遍历,一般对于每个子状态只有0 或 1 两种状态,即要么存在要么不存在。遍历的总数就是 (1 << n);
for(int state = 0;state < (1 << n);state++)
(2)对于任意一个state ,需要遍历state每一位的状态时0还是1,如果是1,代表需要对该数据处理。
所以需要一个循环遍历state的每一位,并过滤出 1 的位置:
if(state & (1 << i))
(3)如何得到一组状态(可能是字符或者别的什么内容)他所对应的state呢?比如 ab,abc ,aabb,ac 。如果压缩状态只判断字符的出现,那么需要一个26位的int 值,分别是11,111,11,101。如何给对应位置记录 1 呢?(1178题)
使用左移取或,将1 左移ASCII码位再取或。
mask |= (1 << (ch - 'a'));
例子: c
000000000000000000000000001
左移三位
00000000000000000000000100
mask取或,有1 则1。完成
(4)如果我要精确state中某一个状态,那就需要是state右移多少位(T2151)
例子:10001 的 第4 位,state >> 4
01000
00100
00010
00001,
& 1 判断,就能判断出是1 还是 0 (同 1为1)
(5)善用 __builtin_popcount(),得到二进制位有多少个1 。