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; }