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 <bits/stdc++.h>
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章