bitset(知识整理+例题总结)

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

https://www.cnblogs.com/RabbitHu/p/bitset.html 胡小兔的博客

【破烂集】大佬的一个技巧——bitset优化_bitset 取交速度慢_7376798669717289的博客-优快云博客 bitset优化

登录—专业IT笔试面试备考平台_牛客网 唐老师的提交代码

遍历bitset中的1:_Find_first和_Find_next_Qres821的博客-优快云博客

知识整理

卡常大法好,神器bitset,存二进制位,类似bool数组的作用,

长度n单次操作时间复杂度O(\frac{n}{64}),空间方面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;
}<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值