bitset Technology(长期更新)
bitset优化暴力很有用,这里记一下bitset的用法。
基本知识
一些底层的东西
是一个只存 0/1 的大小不可变的容器。
有较大的时空优化。寻常寻址按 1 byte=8 bit 寻,一个 bool 变量也会占 1 byte。而 bitset 使 1 byte 的 8 bit 可以分别存下 \(8\) 个 0/1。
这在空间计算上很牛,\(1\) 位 bitset 所占的空间是一个 int 的 \(\frac{1}{32}\)。在一些操作时,时间也会变成 \(\frac{1}{32}\)。一般记作 \(\frac{1}{\omega}\),\(\omega\) 为计算机的位数,视环境不同 \(\omega=32\) 或 \(\omega=64\)。
注意 vector<bool> 的空间优化与 bitset 相同,但是可以动态开空间,但是没有 bitset 的库函数,并且一些表现与 vector 不一致(如 vec[x] 与 &vec[0]+x 不同)。故一般不用 vector<bool>。
支持的东西
头文件
直接万能头。或者 #include<bitset>。
指定大小
bitset<maxn> bs。
构造函数
-
bitset(),每一位都是false。 -
bitset(unsigned long val),设为 \(val\) 的二进制形式。 -
bitset(const string &str),设为0/1串 \(str\)。
后两个是 \(O(\frac{n}{\omega})\)。
运算符
-
位运算
>> << | & ^ ~,只能和另一个 bitset 进行。 -
访问,
[]。 -
判断相等,
== !=。 -
流,可以
cin/cout。但是注意先输入的是高位。
成员函数
-
count(),返回 \(1\) 的个数。 -
size(),返回 bitset 的大小。 -
test(int x),类似at(int x)。 -
any(),返回是否有一位为 \(1\)。 -
none(),返回是否所有都为 \(0\)。 -
all(),返回是否所有都为 \(1\)。 -
set(),所有设为 \(1\)。set(int pos,bool v),将第 \(pos\) 位设为 \(v\)。 -
reset(),将所有设为 \(0\)。reset(int pos),将第 \(pos\) 位设为 \(0\)。 -
flip(),将每一位异或 \(1\)。flip(int pos),将第 \(pos\) 位异或 \(1\)。 -
to_string(),返回其对应的字符串,注意从高位开始输出,故是反的。 -
to_ulong(),返回转换成的unsigned long int,注意如果位数超了会爆 RE。to_ullong(),返回转换成的unsigned long long,也是超位爆 RE。 -
_Find_first(),返回第一个值为 \(1\) 的下标(从下标 \(0\) 开始找)。若没有则返回大小。 -
_Find_next(int pos),返回下标严格大于 \(pos\) 的位置中第一个值为 \(1\) 的位置。若没有 \(1\) 则返回大小。
以上除了单点修改,size(),test() 外,都是 \(O(\frac{n}{\omega})\) 的。

浙公网安备 33010602011771号