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[ix],(ix)

因为是在 ( 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[ix]

然后最后把所有为 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学习的主要内容,如果未能解决你的问题,请参考以下文章

java.util.BitSet 详细分析 学习笔记

bitset学习

IOS开发-OC学习-常用功能代码片段整理

BitSet 是个好东西

java SpringRetry学习的代码片段

python 机器学习有用的代码片段