Bitset学习
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bitset学习相关的知识,希望对你有一定的参考价值。
Bitset学习
0.类模板
1.定义
#include<bitset> //头文件
const int N=10;
//以下两种都可以
bitset<N>b;
bitset<10>b;
2.初始化
字符串若位不足也是高位补0.
字符串中若出现除0,1的其他数则程序会抛出异常.
a.字符串初始化
bitset<3>a("10111"); //101
bitset<5>b("011"); //00011
char str[10]="10111";
bitset<3>c(str); //101
b i t s e t bitset bitset输出的时候是按照从左往右,从高位往地位输出的,也就是我们常见的十进制阅读顺序。
3.位运算
4.[]访问和修改元素
5.常用函数
对于一个叫做bit的bitset:
bit.size() 返回大小(位数)
bit.count() 返回1的个数
bit.any() 返回是否有1
bit.none() 返回是否没有1
bit.set() 全都变成1
bit.set(p) 将第p + 1位变成1(bitset是从第0位开始的!)
bit.set(p, x) 将第p + 1位变成x
bit.reset() 全都变成0
bit.reset(p) 将第p + 1位变成0
bit.flip() 全都取反
bit.flip(p) 将第p + 1位取反
bit.to_ulong() 返回它转换为unsigned long的结果,如果超出范围则报错
bit.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
bit.to_string() 返回它转换为string的结果
size()
输出bitset的位大小
count()
输出bitset中位为1的个数
test()
检测该位是否为1(若为1返回真(1)否则返回假(0))
any()
检测bitset中是否存在1.(返回bool)
none()
检测bitset中是否全为0(即没有1)(返回bool)
all()
检测bitset中是否全为1. (返回bool)
set(idx,bool)
将idx对应的位置为bool
若为空默认全部置为1. 若只有一个参数idx,则默认将idx对应位置为1
reset(idx)
只有一个参数将idx对应位置为 0.
若为空则默认全部位置为0.
flip(idx)
翻转该位, 0变成1,1变成0.若为空默认翻转全部位.
to_string() to_ulong() ,to_ullong()
_Find_first(), _Find_nexst(pos)
6.应用
7.习题
考虑每个值出现的奇偶性,所以是个 01 01 01问题。
然后 d p dp dp, d p [ i ] + = d p [ i − x ] , ( i ≥ x ) dp[i]+=dp[i-x],(i\\ge x) dp[i]+=dp[i−x],(i≥x)
因为是在 ( m o d 2 ) \\pmod2 (mod2)意义下,所以考虑用 b i t s e t bitset bitset优化。
d p = d p ⊕ ( d p < < x ) dp=dp\\oplus (dp<<x) dp=dp⊕(dp<<x)
相当于把从第 x x x位的所有 d p [ i ] + = d p [ i − x ] dp[i]+=dp[i-x] dp[i]+=dp[i−x]
然后最后把所有为 1 1 1的下标异或起来就行了。
时间复杂度: O ( n × 2 × 1 0 6 32 ) ≈ O ( 6 × 1 0 7 ) O(\\dfracn\\times 2\\times 10^632)\\approx O(6\\times 10^7) O(32n×2×106)≈O(6×107)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2e6+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n)
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y)
if(x<y) x=y;
template <typename T>
void cmn(T &x,T y)
if(x>y) x=y;
bitset<N>a;
int main()
int n;scanf("%d",&n);a[0]=1;
rep(i,1,n)
int x;scanf("%d",&x);
a^=(a<<x);
int s=0,m=2e6;
rep(i,1,m) if(a[i]) s^=i;
printf("%d\\n",s);
return 0;
以上是关于Bitset学习的主要内容,如果未能解决你的问题,请参考以下文章