bitset定义与初始化
bitset是STL提供的用于记录01串的容器
也就是bitset的每个元素只能为0/1用bitset之前别忘了:
#include<bitset>1
以下是正确的定义方式:
bitset<16> a; //第0~15位都是0
bitset<6> b(string("010010")); //用字符串初始化b
bitset<32> c(0x80000000); //第0位是1,其他都是0123注意bitset声明后长度不可改变
和数组一样,bitset从0开始编号
bitset的操作
以下是bitset常用操作:
a.any() //a中是否含1
a.none() //a是否全为0
a.count() //a中有几个1
a.[pos] //访问第pos位
a.test(pos) //第pos位是否为1
a.set() //全部设为1
a.reset() //全部清零
a.flip() //全部取反
a.to_ulong() //转成32位无符号整数123456789或者也可以对bitset使用位操作(返回一个bitset):
a|b
a&b
a^b
~a
a<<1
a>>1123456这些都和整数的位操作类似,这里不做解释
bitset的原理
相信大家都打过高精度吧
bitset的原理与高精度压位类似即:将一个很长的01串按64位一组划分
每组01串用一个64位无符号整数记录bitset所有的操作都是基于对整数的位操作实现的。
所以bitset的效率非常高,可以看作O(N/64)O(N/64)
bitset的应用
由于bitset的高效率并且易于使用
所以一般用于各种暴力骗分(见前言)
但是,如果真的想要多拿一些分,可以考虑手写bitset,这样常数比较小
例题
POJ2443
示例程序:
#include<cstdio>
#include<bitset>
using namespace std;
#define nc getchar
int n,q;
bitset<1002> S[10002];
inline int red(){
int res=0,f=1;char ch=nc();
while (ch<'0'||'9'<ch) {if (ch=='-') f=-f;ch=nc();}
while ('0'<=ch&&ch<='9') res=res*10+ch-48,ch=nc();
return res*f;
}
int main(){
n=red();
for (int i=1;i<=n;i++)
for (int j=1,k=red();j<=k;j++)
S[red()].set(i);
q=red();
while (q--){
int i=red(),j=red();
if ((S[i]&S[j]).any()) printf("Yes\n");else printf("No\n");
}
return 0;
}
bitset
转载Mercury_Lc 博主文章分类:Orz
文章标签 位操作 #include 无符号整数 文章分类 JavaScript 前端开发
下一篇:苦战终将迎来胜利

-
Bitset学习
Bitset学习0.类模板1.定义#include<bitset> //头文件const int
数据挖掘 python 数据分析 #define 字符串 -
bitset用法
bitset用法介绍bitset大概就是类似于bool数组一样的东西.但是它的每个位置只占1bit(特别特别小)bitset的原理大概是将很多数压成一个,从而节省空间和时间(
算法 数据结构 #include 初始化 数组 -
bitset总结
足补0,注意从
初始化 位取反 默认构造函数 -
java sql 转义函数 sql里面的转义字符
一、转义字符''在一个字符串中,如果想出现一个单引号,则需要两个单引号'',第一个单引号表示转义第二个单引号表示单引号;
java sql 转义函数 单引号 字符串 转义