bitset 一个卡常必备神器
std::bitset
是标准库中的一个存储 0/1
的大小不可变容器。严格来讲,它并不属于 STL——————————————源自于oi-wiki的介绍。
简单来说bitset就是一种类似于数组的结构(只能存1 or 0)且可以优化内存空间,一个元素只占1bit 因此计算一些信息时,所需时间也是其1/32.
复杂度:一般记作O(n/32) 但这不太严谨 还有的记作O(n/w)其中w=32(计算机的位数),这种记法较为普遍接受。
食用方法:
1.先开个头文件:
#include <bitset>
2.指定大小:
bitset<1000> bz;// 下面的都是用这个bz来解释。
3.定义与初始化
bitset类型可以用string和整数初始化(整数转化成对应的二进制)
#include<iostream> #include<bitset> #include<cstring> using namespace std; int main() { bitset<23>bit (string("11101001")); cout<<bit<<endl; bit=233; cout<<bit<<endl; return 0; }
输出
00000000000000011101001
00000000000000011101001
4.基本运算
bitset支持所有位运算
bitset<4>s1(string("1001")); bitset<4>s2(string("1000")); s1[1] = 1; cout<<s1[0]<<endl; //1 cout<<s1<<endl; //1011 cout<<(s1==s2)<<endl; //0 cout<<(s1!=s2)<<endl; //1 cout<<(s1^s2)<<endl; //0011 cout<<(s1&s2)<<endl; //1000 cout<<(s1|s2)<<endl; //1011 cout<<(~s1)<<endl; //0100 cout<<(s1>>1)<<endl; //0101
5.常用函数
count( ): 返回 true 的数量
size( ): 返回 bitset 的大小
any( ): 若存在某一位是 true 则返回 true ,否则返回 false
none( ): 若所有位都是 false 则返回 true ,否则返回 false
set( ): 将整个 bitset 设置成 true
set(pos,va1=true/false) 将某一位设置成 true/false 例如
bz.set(2,true)||bz.set(2,false)||bz.set(2)
reset( ):将整个 bitset 设置成 false
reset(pos): 将某一位设置成 false 相当于 set(pos ,false) 例如
bz.reset(2)//////////////////////补充前面的 bz.set()////////bz.reset()
flip( ): 翻转每一位(相当于异或一个全是1的 bitset)
flip(pos): 翻转某一位
_Find_ first( ): 返回 bitset 第一个 true
的下标,若没有 true
则返回 bitset
的大小
_Find_next(pos): 返回 pos 后面(下标严格大于 pos 的位置)第一个 true 的下标,若 pos 后面没有 true 则返回 bitset 的大小
把两个相结合就可以发生奇妙的反应
#include<bits/stdc++.h> int main() { std::bitset<1001> bz; bz.set(2); bz.set(4); bz.set(233); for(int i = bz._Find_first(); i != bz.size(); i = bz._Find_next(i)) std::cout << i << ' '; }
这样就可以遍历一个 bitset了
最后
bitset
与树分块结合可以解决一类求树上多条路径信息并的问题 然后还可以与莫队结合 等等........
完结撒花....(ohohohohohohoh)
还是老话 :
作者不易,,,ε=(´ο`*)))唉,,,
转载请附上链接Thanks♪(・ω・)ノ