手写 bitset 模板

#include<vector>
using namespace std;
typedef unsigned long long ull;
struct Bitset{
    size_t siz=0;
    vector<ull> x;
    inline void init(size_t SIZ){siz=SIZ;x.resize((SIZ>>6)+((SIZ&63)?1:0));}
    inline void set(const size_t &a){x[a>>6]|=1ull<<(a&63);}
    inline void set(){
        x.assign(x.size(),~0ull);
        if(siz&63) x.back()&=(1ull<<(siz&63))-1;
    }
    inline void reset(const size_t &a){x[a>>6]&=~(1ull<<(a&63));}
    inline void reset(){x.assign(x.size(),0ull);}
    inline void flip(const size_t &a){x[a>>6]^=1ull<<(a&63);}
    inline bool ask(const size_t &a)const{return x[a>>6]>>(a&63)&1;}
    inline Bitset &operator^=(const Bitset &a){
        for(size_t i=0;i<x.size();i++) x[i]^=a.x[i];
        return *this;
    }
    inline Bitset split(const size_t &l,const size_t &r)const{
        Bitset res;
        size_t len=r-l+1;
        res.init(len);
        size_t block=l>>6,bit=l&63;
        for(size_t i=0;i<res.x.size();i++){
            res.x[i]=(x[i+block]>>bit);
            if(bit&&i+block+1<x.size()) res.x[i]|=x[i+block+1]<<(64-bit);
        }
        if(len&63) res.x.back()&=(1ull<<(len&63))-1;
        return res;
    }
    inline Bitset operator^(const Bitset &x)const{return Bitset(*this)^=x;}
};
posted @ 2025-10-16 16:57  headless_piston  阅读(13)  评论(0)    收藏  举报