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;
}