zoukankan      html  css  js  c++  java
  • bitset

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

    绝大部分来自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对应起来的,否则不对应

  • 相关阅读:
    如何通过经纬度获取地址信息?
    通过google地图的webservice根据城市名称获取经纬度
    PHP 使用 GeoLiteCity 库解析 IP 为地理位置
    PHPExcel对于Excel中日期和时间类型的处理
    phpexcel来做表格导出(多个工作sheet)
    PHPExcel读取excel文件
    读取上传的CSV为DataTable
    判断sqlserver对象是否存在
    async & await 的前世今生
    .NET4.5之初识async与await
  • 原文地址:https://www.cnblogs.com/greenofyu/p/11697950.html
Copyright © 2011-2022 走看看