Message Decoding UVA - 213

https://vjudge.net/problem/UVA-21383页4-4例题

主要是考察输入格式的,会用加回车的方式恶心你。

参照刘汝佳的方法,我用了map来保存每个编码与字符的一一对应的关系,例如“01”——‘C’ 即map["01"]='C';

感觉这种方式更自然。可能是还没有到第五章讲到,所以他用的数组。

另外,这个题不能用   关闭io流绑定的方式来加速,虽然没有用printf和scanf但是getchar()和getline()这两个函数是用c语言io流里的,解除绑定后会冲突!->runtime error.

#include<iostream>
#include<string>
#include<map>
using namespace std;

string S; map<string, char> Book;

void MakeBook()
{
    int bitnum = 1; int number = 0;
    for (int i = 0; i < S.size(); i++)
    {
        string temp;
        if (number == (1 << bitnum)-1) { bitnum++; number = 0; }
        int bitcnt = bitnum; int t = number;
        while (bitcnt)
        {
            temp+= t / (1 << (bitcnt - 1)) ? '1' : '0';
            t = t % (1<<(bitcnt-1)); bitcnt--;
        }
        Book[temp] = S[i]; number++;
    }
}

char ReadChar()
{
    for (;;)
    {
        char c = getchar();
        if (c != '\n'&&c != '\r') return c;
    }
}

int ReadInt(int x)
{
    int t = 0;
    while (x--)
    {
        t = 2 * t + ReadChar() - '0';
    }
    return t;
}

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    while (getline(cin, S))
    {
        string output; Book.clear();
        MakeBook();
        for (;;)
        {
            int lengh = ReadInt(3);
            if (lengh == 0) 
            { 
                getchar(); 
                break; 
            }
            for (;;)
            {
                string temp;
                for (int i = 0; i < lengh; i++) temp += ReadChar();
                string end(lengh, '1');
                if (temp == end) break;
                else output+=Book[temp];
            }
        }
        cout << output << endl;
    }
    return 0;
}

 

posted @ 2019-03-23 17:00  超融合  阅读(162)  评论(0编辑  收藏  举报