bitset Technology(长期更新)

bitset优化暴力很有用,这里记一下bitset的用法。

基本知识

一些底层的东西

是一个只存 0/1 的大小不可变的容器。

有较大的时空优化。寻常寻址按 1 byte=8 bit 寻,一个 bool 变量也会占 1 byte。而 bitset 使 1 byte8 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})\) 的。

手写 bitset

do-while-true 的 blog

结合埃氏筛筛素数

求解高维偏序

优化存在性背包

其他待补

posted @ 2024-11-27 08:31  RandomShuffle  阅读(14)  评论(0)    收藏  举报