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})\) 的。