bitset用法及应用

参考文章:https://blog.csdn.net/bobodem/article/details/51212888

构造函数
bitset<n> b;
 b有n位,每位都为0.参数n可以为一个表达式.
如bitset<5> b0;则"b0"为"00000";
 
bitset<n> b(unsigned long u);
 b有n位,并用u赋值;如果u超过n位,则顶端被截除
如:bitset<5>b0(5);则"b0"为"00101";
 
bitset<n> b(string s);
 b是string对象s中含有的位串的副本
string bitval ( "10011" );
bitset<5> b0 ( bitval );
则"b0"为"10011";


bitset<n> b(s, pos);
 b是s中从位置pos开始位的副本,前面的多余位自动填充0;
string bitval ("01011010");
bitset<10> b0 ( bitval, 3 );
则"b0" 为 "0000011010";
 
bitset<n> b(s, pos, num);
 b是s中从位置pos开始的num个位的副本,如果num<n,则前面的空位自动填充0;
string bitval ("11110011011");
bitset<6> b0 ( bitval, 3, 6 );
则"b0" 为 "100110";
 

bitset<n> b;

b有n位,每位都为0

bitset<n> b(u);

b是unsigned long型u的一个副本

bitset<n> b(s);

b是string对象s中含有的位串的副本

bitset<n> b(s, pos, n);

b是s中从位置pos开始的n个位的副本

bitset操作

扫描二维码关注公众号,回复: 2449323 查看本文章

b.any()

b中是否存在值为1的二进制位?

b.none()

b中不存在值为1的二进制位吗?

b.count()

b中值为1的二进制位的个数

b.size()

b中二进制位的个数

b[pos]

访问b中在pos处的二进制位

b.test(pos)

b中在pos处的二进制位是否为1?

b.set()

把b中所有二进制位的值为1

b.set(pos)

把b中在pos处的二进制位值为1

b.reset()

把b中所有二进制位的值为0

b.reset(pos)

把b中在pos处的二进制位值为0

b.flip()

把b中所有二进制位逐位取反

b.flip(pos)

把b中在pos处的二进制位取反

b.to_ulong()

用b中同样的二进制位返回一个unsigned long值

os << b

把b中的位集输出到os流

看道题目:

牛客练习赛22 C 简单瞎搞题  

https://www.nowcoder.com/acm/contest/132/C
 

题目描述

一共有 n个数,第 i 个数是 xi 

xi 可以取 [li , ri] 中任意的一个值。

,求 S 种类数。

输入描述:

第一行一个数 n。 
然后 n 行,每行两个数表示 li,ri。

输出描述:

输出一行一个数表示答案。

示例1

输入

复制

5
1 2
2 3
3 4
4 5
5 6

输出

复制

26

备注:

1 ≤ n , li , ri ≤ 100
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
using namespace std;
bitset <100010> b,t;
int main()
{
    
    int n;
    while(~scanf("%d",&n))
    {
        b[0]=1;
        for(int i=1;i<=n;i++)
        {
            int lr,ur;
            scanf("%d%d",&lr,&ur);
            t.reset(); ///全部置0
            for(int j=lr;j<=ur;j++)
            {
                t|=(b<<j*j); ///位运算
            }
            b=t;///滚动数组赋值
        }
        printf("%d\n",b.count());
    }
    return 0;
}

举个例子:这里就不平方了,[1,2] ,[2,3]

那就首先第一组,变为000110

第二组为(011000|110000)->(111000) 故是三种。

你看 第一个加粗的1,是先往左移2个,再往左移2个,得到的位置

第二个加粗的1,是先往左移1个,再往左移3个,得到的位置

再或运算,故的结果。

猜你喜欢

转载自blog.csdn.net/ljd201724114126/article/details/81077207
今日推荐