引言
Bitset 是一种利用对布尔数组压位存储的方法,达到优化时间常数、空间常数的目的的黑科技。利用 Bitset,可以方便地对布尔数组进行按位逻辑运算,优化 32 或 64 的常数。在某些素质极差的卡常题中运用会有奇效。
Bitset 可以直接当做布尔数组使用。C++ STL 中也内置了 Bitset,然而由于常数较大,不如手写的 Bitset 优秀。
代码模板
注意:如果需要改为 64 位 Bitset,需要把 __builtin_popcount()
函数改为 __builtin_popcountll()
(或者直接手写~)。
struct bitset{
static const int maxn=35,maxm=30;
int set[maxn];
inline void clear(){
memset(set,0,sizeof(set));
}
inline bool operator [](int index){
index--;
return (set[index/maxm]>>index%maxm)&1;
}
inline void set_value(int index,int value){
index--;
if (value) set[index/maxm]|=(int)1<<index%maxm; else set[index/maxm]&=~((int)1<<index%maxm);
}
inline void merge(bitset &b){
for (int i=0;i<maxn;i++) set[i]|=b.set[i];
}
inline int count(){
int ret=0;
for (int i=0;i<maxn;i++) ret+=__builtin_popcount(set[i]);
return ret;
}
};