bitset

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章