UVa 213 Message Decoding

题目大意:
用下列01串存编码头:
0,00,01,10,000,001,010,011,100,101,110,0000,0001,……
编码头的每个字符对应上面的01串。
然后再输入编码文本(只含01),格式为 长度 内容 终止符。
长度:三个01字符(000~111);
内容:长度个01字符;
终止符:长度个1;

Sample input

TNM AEIOU

0010101100011

1010001001110110011

11000

$#**\

0100000101101100011100101000

Sample output

TAN ME

##*\$

代码如下:

   
     
  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. int readchar() {//读入字符,并且过滤开头回车或换行
  5. for (;;) {
  6. int ch = getchar();
  7. if (ch != '\n' && ch != '\r')
  8. return ch;
  9. }
  10. }
  11. int readint(int c) {//计算二进制大小
  12. int v = 0;
  13. while (c--) {
  14. v = v * 2 + readchar() - '0';
  15. }
  16. return v;
  17. }
  18. int code[8][1 << 8];//1 << 8相当于1*2^8, [x][y]表示长度为y(长度为x)的字符
  19. bool readcodes() {//读入数据,并且判断是否读入成功
  20. memset(code, 0, sizeof(code));
  21. code[1][0] = readchar();
  22. for (int len = 2; len <= 7; ++len) {
  23. for (int i = 0; i < (1 << len) - 1; ++i) {
  24. int ch = getchar();
  25. if (ch == EOF) return false;//读到文件结束,说明读入失败
  26. if (ch == '\n' || ch == '\r') return true;//读到换行或回车说明读入成功
  27. code[len][i] = ch;
  28. }
  29. }
  30. return true;
  31. }
  32. int main() {
  33. while (readcodes()) {
  34. for (;;) {
  35. int len = readint(3);
  36. if (len == 0) break;
  37. for (;;) {
  38. int v = readint(len);
  39. if (v == (1 << len) - 1) break;//全1时退出
  40. putchar(code[len][v]);
  41. }
  42. }
  43. putchar('\n');
  44. }
  45. return 0;
  46. }





你可能感兴趣的:(message)