我是蒟蒻一名,请大佬勿喷。
绝大部分来自https://www.cnblogs.com/magisk/p/8809922.html , 可以去大佬博客逛一逛
bitset是C++中类似数组的一种结构,但是因为每位只能是0或1,对于某些明显的二进制题目来说,如果你不会压位的话,bitsei确实为一个很好的选择。
bitset有4个构造函数。
1 #include <iostream> 2 #include<bitset> 3 using namespace std; 4 int main() 5 { 6 bitset<10> a("10");//此处不能出现除了0 1之外的字符,否则将会抛出异常 7 bitset<10> b(10);//二进制 8 bitset<10> c;//无参构造函数,初始化为0 9 bitset<10> d(a);//拷贝构造函数 10 cout<<a<<endl; 11 cout<<b<<endl; 12 cout<<c<<endl; 13 cout<<d<<endl; 14 //使用bitset解题时,注意他如果要输出最后二进制答案,一定要反过来 15 return 0; 16 }
若bitset位数大于操作数,前面用零补充
bitset中有的操作符
1 #include <iostream> 2 #include<bitset> 3 using namespace std; 4 int main() 5 { 6 bitset<10> a("10");//此处不能出现除了0 1之外的字符,否则将会抛出异常 7 bitset<10> b(10);//二进制 8 bitset<10> c;//无参构造函数,初始化为0 9 bitset<10> d(a);//拷贝构造函数 10 11 cout<<(a&b)<<endl;//按位与,整型数也是二进制存在计算机里面的,bitset当然也可以 12 //意思就是整型有的位运算,bitset全都有 13 //不过要记住的是要打括号 14 cout<<(a|b)<<endl; 15 cout<<(a^b)<<endl; 16 cout<<(a>>1)<<endl; 17 cout<<(a<<1)<<endl; 18 //前面说bitset类似于数组,那么肯定可以通过下标访问元素的 19 a[0]=1; 20 cout<<a<<endl;//结果为0000000011 21 //还是那个注意点,反的 22 //结合int的值就很好理解了 23 return 0; 24 }
如果题目要求输出不带前导零的二进制答案,那么
#include <iostream> #include<bitset> using namespace std; int main() { bitset<10> a("10");//此处不能出现除了0 1之外的字符,否则将会抛出异常 int w=-1; for(int i=a.size();i>=0;i--) { if(a[i]) { w=i; break; } } for(int i=w;i>=0;i--) { cout<<a[i]; } return 0; }
虽然下面会讲bitset的函数可以完成同样的功能,但是蒟蒻的我觉得应该效率和循环应该差不太多
bitset中的函数
1 #include <iostream> 2 #include<bitset> 3 using namespace std; 4 int main() 5 { 6 bitset<10> a("100010"); 7 cout<<a.count()<<endl;//返回bitset中1的个数 8 cout<<a.test(1)<<endl;//相当于数组式的访问,但是会有下标检查 9 cout<<a.size()<<endl;//返回大小,是最开始定义的大小 10 cout<<a.any()<<endl;//返回bitset中是否有1 11 cout<<a.none()<<endl;//返回bitset中是否没有1 12 cout<<a.all()<<endl;//返回是否全为1 13 14 15 bitset<10> b("1111011"); 16 cout<<b.flip()<<endl;//取反,若给参数,则将参数位取反 17 cout<<b.set()<<endl;//置1 18 cout<<b.reset()<<endl;//清0 19 //以上全都可带参数,大概同flip 20 cout<<b.set(2,1)<<endl;//相当于b[2]=1; 21 22 23 bitset<10> c("1011011"); 24 string t1=c.to_string(); 25 unsigned t2=c.to_ulong(); 26 unsigned long long t3=c.to_ullong(); 27 cout<<t1<<endl;//1011011 28 cout<<t2<<endl;//91 29 cout<<t3<<endl;//91 30 return 0; 31 }
差点忘了贴实例
链接:https://ac.nowcoder.com/acm/contest/1114/C
来源:牛客网
有n个长度为m的文本串,每个串只含有'0'和'1'。接下来有Q次询问,每次给出一个长度为m的字符串,且只含有'0','1'和'_'。如10_1_1。下划线可以匹配'0'或'1'。即10_1_1可以匹配101111,101101,100111,100101四种串。每次询问求出n个文本串中有多少个可以与当前询问的串匹配。
1<=n,m<=1000,1<=q<=100
1 #include <iostream> 2 #define ll long long 3 #include<bitset> 4 using namespace std; 5 bitset<1009> bit[1009]; 6 int main() 7 { 8 int n,m; 9 cin>>n>>m; 10 for(int i=0;i<n;i++) 11 { 12 for(int j=0;j<m;j++) 13 { 14 char t; 15 cin>>t; 16 bit[i][j]=( t=='1' ); 17 } 18 } 19 int q; 20 cin>>q; 21 while(q--) 22 { 23 int ans=0; 24 bitset<1009> t1,t2,t3,t4; 25 for(int i=0;i<m;i++) 26 { 27 char tmp; 28 cin>>tmp; 29 t1[i]=tmp=='1'?1:0; 30 t2[i]=tmp=='0'?1:0; 31 } 32 for(int i=0;i<n;i++) 33 { 34 t3=t1&bit[i]; 35 t4=t2&bit[i]; 36 if((t3==t1)&&t4.count()==0) 37 ans++; 38 } 39 cout<<ans<<endl; 40 } 41 return 0; 42 }
代码有点丑,希望别介意(介意我也没办法)
观察题目之后发现m*n=1e6
所以如果可以直接判断文本串是否与询问匹配就可以了
t1存储询问串中所有的1
t2存储询问串中所有的0
因为1&0=0
所以将询问串中等于0的位置在t2中置1,如果t2&文本串==0则0对应起来的,否则不对应