思路来源
https://www.cnblogs.com/RabbitHu/p/bitset.html 胡小兔的博客
【破烂集】大佬的一个技巧——bitset优化_bitset 取交速度慢_7376798669717289的博客-优快云博客 bitset优化
登录—专业IT笔试面试备考平台_牛客网 唐老师的提交代码
遍历bitset中的1:_Find_first和_Find_next_Qres821的博客-优快云博客
知识整理
卡常大法好,神器bitset,存二进制位,类似bool数组的作用,
长度n单次操作时间复杂度,空间方面bitset中一位占1 bit,相当于char空间的1/8,
下标从0开始,整数和bool[]数组都可转bitset,
大小需要编译时确定,否则vector<bool>(奇怪的用法orz),
以下是bitset的一些常用用法,转化为ul或ull时,需保证不会溢出,不然会报overflow
#include<iostream>
#include<cstdio>
#include<bitset>
#include<cstring>
using namespace std;
const int N=15;
bitset<N>x,y,z(255),a(0xfa),b(string("0101"));
bitset<32>bs(2147483647);
int main(){
x[0]=1;x<<=1;y>>=1;
x^=y;x|=y;x&=y;x=~y;
puts(x==y?"Yes":"No");
puts(x!=y?"Yes":"No");
printf("%s\n",x.any()?"Yes":"No");//是否有1
printf("%s\n",x.none()?"Yes":"No");//是否全0
printf("%d\n",x.count());//1的个数
printf("%d\n",x.size());//bitset长度
printf("%s\n",x[0]==1?"Yes":"No");//下标从0起
printf("%s\n",x.test(1)?"Yes":"No");//x[1]
x.set();x.reset();x.flip();
x.set(1,0);//加第二维参可以赋0 否则默认赋1
y.set(5);y.reset(5);y.flip(5);
cout<<x<<endl;//输出x的01序列
printf("%llu\n",x.to_ulong());//unsigned long
printf("%llu\n",z.to_ullong());//unsigned long long
string c=b.to_string();//string
cout<<c<<endl;
//将int转化为二进制序列,强行偷懒
int v=2147483647;
bitset<32>d(v);
cout<<d<<endl;//首位符号位
string e=d.to_string().substr(1);
cout<<e<<endl;//不含符号位
return 0;
}<

本文深入探讨了bitset在算法竞赛中的高效应用,包括快速位运算、集合操作及优化技巧,如链式前向星、压位Floyd和BFS算法,以及非定长bitset的灵活运用,适用于解决大规模数据处理和图论问题。
最低0.47元/天 解锁文章
2818

被折叠的 条评论
为什么被折叠?



