bitset归结,一个实例

我是蒟蒻一名,请大佬勿喷。

绝大部分来自https://www.cnblogs.com/magisk/p/8809922.html   ,  可以去大佬博客逛一逛

bitset是C++中类似数组的一种结构,但是因为每位只能是0或1,对于某些明显的二进制题目来说,如果你不会压位的话,bitsei确实为一个很好的选择。

bitset有4个构造函数。

 1 #include 
 2 #include
 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<endl;
11     cout<endl;
12     cout<endl;
13     cout<endl;
14     //使用bitset解题时,注意他如果要输出最后二进制答案,一定要反过来
15     return 0;
16 }

若bitset位数大于操作数,前面用零补充

 

bitset中有的操作符

 1 #include 
 2 #include
 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)<//按位与,整型数也是二进制存在计算机里面的,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<//结果为0000000011
21                     //还是那个注意点,反的
22                     //结合int的值就很好理解了
23     return 0;
24 }

如果题目要求输出不带前导零的二进制答案,那么

#include 
#include
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< 
 

  虽然下面会讲bitset的函数可以完成同样的功能,但是蒟蒻的我觉得应该效率和循环应该差不太多

 

bitset中的函数

 1 #include 
 2 #include
 3 using namespace std;
 4 int main()
 5 {
 6     bitset<10> a("100010");
 7     cout<//返回bitset中1的个数
 8     cout<1)<//相当于数组式的访问,但是会有下标检查
 9     cout<//返回大小,是最开始定义的大小
10     cout<//返回bitset中是否有1
11     cout<//返回bitset中是否没有1
12     cout<//返回是否全为1
13 
14 
15     bitset<10> b("1111011");
16     cout<//取反,若给参数,则将参数位取反
17     cout<set()<//置1
18     cout<//清0
19     //以上全都可带参数,大概同flip
20     cout<set(2,1)<//相当于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<//1011011
28     cout<//91
29     cout<//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 
 2 #define ll long long
 3 #include
 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)
11     {
12         for(int j=0;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)
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)
33         {
34             t3=t1&bit[i];
35             t4=t2&bit[i];
36             if((t3==t1)&&t4.count()==0)
37                 ans++;
38         }
39         cout<endl;
40     }
41     return 0;
42 }

代码有点丑,希望别介意(介意我也没办法)

观察题目之后发现m*n=1e6

所以如果可以直接判断文本串是否与询问匹配就可以了

t1存储询问串中所有的1

t2存储询问串中所有的0

因为1&0=0

所以将询问串中等于0的位置在t2中置1,如果t2&文本串==0则0对应起来的,否则不对应

你可能感兴趣的:(bitset归结,一个实例)