学习bitset的使用方法,学习一些在网上找到的bitset的使用方法,从中调用一些常用的使用方法。
构造函数
bitsetn b;
b有n比特,分别为0。 参数n也可以是公式。
例如bitset5 b0; “b0”是“00000”;
Bitsetnb(unsignedlongu );
有b位,用u赋值; 如果u超过n位,尖端将被切掉
例如:Bitset5b0(5; “b0”是“00101”;
Bitsetnb(strings );
b是包含在string对象s中的比特串的副本
字符串(' 10011 );
Bitset5B0(bitval4;
' b0 '是' 10011 ';
Bitsetnb(s,pos,num );
b是从s中的位置pos开始的num个位的副本,在numn的情况下,前面的空位自动填充0;
stringbitval(1110011011 );
bitset 6b0(bitva l5,3,6 );
' b0 '是' 100110 ';
os b
将b的位设置输出到操作系统流
osb
输入b。 如果输入的字符不是0或1,例如“cinb”,则只取该字符前面的二进制位。
bool any () )
有设置为1的二进制比特吗? 与none ()相反
bool none () )
设置为1的二进制位不存在吗? 也就是说,都是0吗? any ) )相反。
size_t count ()
二进制比特是1的个数。
size_t size ()
二进制位的数量
flip () )
逐位反转所有二进制位
flip(size_tpos )。
将pos中的二进制位颠倒
bool operator[](size_type Pos )
在pos上获取二进制位
集() )。
将所有二进制位设置为1
这是销售点
将pos上的二进制位置设为1
reset () )
将所有二进制位设置为0
是重置(pos )
将pos上的二进制位置设为0
注意: bitset只能和bitset运算,不能和数值运算
另外,找到两个相关的bitset主题的话,确实可以使用bitset之后大幅减少代码量。 POJ2443 :思路:最多10000,为每个数打开bitset1000,保存它是否属于对应的位集合后,保存ans即2个bitset和运算即可。 # include cstring # include iostream # include algorithm # include cmath include utility # include stack # include queue # include map (x ) 3360 ) y ) #define min(x ) x,y ) ) x ) ) y )? (x ) 3360 ) y ) # define inf0x3F3 F3 fusingnamespacestd; bitset1005 bit[10005]; int N,m,t,a,b; int main () Scanf ) ' %d ',n ); for(intI=0; iN; I ) Scanf('%d ',m ); for(intj=0; jM; j ) Scanf('%d ',a ); bit[a].set(I; }scanf('%d”,t ); for(intI=0; 信息技术; I ) Scanf('%d%d ),a,b ); if () bit [ a ] bit [ b ] (.any ) ) ) printf ) ' yesn ' ); ELSEprintf(no ) n ); } return 0; } View Code
HDU4920 :
想法:矩阵化后以0,1,2为值的矩阵,bitset记忆矩阵上0,1,2的位置。
可以用count快速计算出1*1、1*2、2*1、2*2的个数,容易得到答案。
注:据说这个问题剩下的优化的想法是通过转置b矩阵,加快对数组的访问。 也就是说,转置后,每次都访问1而不是n,其奇妙的效果不言而喻。 当然仅限于这个常数水平的优化!
# include cstdio # include cstring # include iostream # include algorithm # include cmath # include vector # include utility # includ include include map # include deque # include bitset # definemax (x,y ) ) x ) ) y? (x ) 3360 ) y ) #define min(x ) x,y ) ) x ) ) y )? (x ) 3360 ) y ) # define inf0x3F3 F3 fusingnamespacestd; bitset805 A[805][3],B[805][3]; int N,k,c; int main () while ) Scanf )“%d”,n )!=EOF N ) for(intI=0; iN; I ) for(intj=0; j3; j () a[I](j ).reset ); B[i][j].reset (; }for(intI=0; iN; I ) for(intj=0; jN; j ) Scanf('%d ',k ); a[I][k%3].set(j ); }for(intI=0; iN; I ) for(intj=0; jN; j ) Scanf('%d ',k ); b[j][k%3].set(I; }for(intI=0; iN; I ) for(intj=0; jN; j () c=(a[I][1]b[j][1] ).count ) ) A[i][1]B[j][2] ).2 ) a [ I ] [2] b [ j ] if ELSEprintf('%dn ',C%3); } } return 0; } View Code
总结:
bitset确实是位运算的一大神器,在各种状态的压缩中都能起到不可思议的作用,但在速度上并不突出,前两题的测试时间相对较长,但一旦使用,你就离成功不远了。 哈哈!
转载于:https://www.cn blogs.com/math ics/p/3923557.html