bitset HDU6515 Coding Problem

Coding Problem

[ HDU - 6515 ]

题目大意:给你一个字符串,每个字母的ASCII二级制颠倒过来组成一个01数组。
然后这个数组每六位组成一个数字的ASCII输出

一道模拟题,使用C++中的bitset类型会简单的很多

那么正好来学习一下bitset的用法:

bitset

此处参考了这份博客:https://www.cnblogs.com/magisk/p/8809922.html

bitset大概就是一个二进制数组,每个位置只占1bit,想一下状压dp?

bitset的原理大概是将很多数压成一个,从而节省空间和时间(暴力出奇迹)

构造

构造时可以直接指定大小,也可以使用string和字符串数组来进行构造
需要注意的是,在使用字符串构造时,字符串中只能包含01,否则会抛出异常

bitset<4> bitset1;  //无参构造,长度为4,默认每一位为0
bitset<8> bitset2(12);  //长度为8,二进制保存,前面用0补充

string s = "100101";
bitset<10> bitset3(s);  //长度为10,前面用0补充
char s2[] = "10101";
bitset<13> bitset4(s2);  //长度为13,前面用0补充

cout << bitset1 << endl;  //0000
cout << bitset2 << endl;  //00001100
cout << bitset3 << endl;  //0000100101
cout << bitset4 << endl;  //0000000010101

性质

它支持所有的位运算操作:^ & | >>

bitset的函数

bit.size()       返回大小(位数)
bit.count()     返回1的个数
bit.any()       返回是否有1
bit.none()      返回是否没有1
bit.set()       全都变成1
bit.set(p)      将第p + 1位变成1(bitset是从第0位开始的!)
bit.set(p, x)   将第p + 1位变成x
bit.reset()     全都变成0
bit.reset(p)    将第p + 1位变成0
bit.flip()      全都取反
bit.flip(p)     将第p + 1位取反
bit.to_ulong()  返回它转换为unsigned long的结果,如果超出范围则报错
bit.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
bit.to_string() 返回它转换为string的结果

题解

需要注意的坑点是这道题不能有换行符,行尾有空格

代码如下

#include 
using namespace std;

string change(char c)
{
    bitset<8> b((int)c);
    stringstream str;
    string s;
    str << b;
    str >> s;
    reverse(s.begin(), s.end());
    return s;
}

int main(void)
{
    string s;
    cin >> s;
    for (int i = 0; i < s.size(); i+= 3) {
        string ts = change(s[i]) + change(s[i + 1]) + change(s[i + 2]);
        for (int j = 0; j < ts.size(); j+= 6) {
            bitset<6> B(ts, j, 6);
            printf("%d ", B);
        }
    }

    return 0;
}

你可能感兴趣的:(ACM,STL)