首页 > 编程知识 正文

Bitset小结 (POJ2443 & HDU4920)

时间:2023-05-04 05:49:16 阅读:168226 作者:4971

学习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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。