POINT:

  关于表示一个编码:利用code字符数组表示一个编码字符,其中code[len][val]表示长度为len,二进制值为val的字符;

 

主程序如下:

 1 #include <iostream>
 2 #include <sstream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <string>
 7 #include <vector>
 8 #include <set>
 9 #include <cctype>
10 #include <algorithm>
11 #include <cmath>
12 #include <deque>
13 #include <queue>
14 #include <map>
15 #include <stack>
16 #include <list>
17 #include <iomanip>
18 
19 using namespace std;
20 #define INF 0x7fffffff
21 #define maxn 1010
22 typedef unsigned long long ull;
23 
24 int code[8][1<<8];
25 
26 int main()
27 {
28     while(readcodes())
29     {
30         //printcodes();
31         for(;;)
32         {
33             int len = readint(3);
34             if(len == 0)    break;
35             //printf("len = %d\n", len);
36 
37             for(;;)
38             {
39                 int v = readint(len);
40                 //printf("v = %d\n", v);
41                 if(v == (1<<len)-1) break;
42                 putchar(code[len][v]);
43             }
44         }
45         putchar('\n');
46     }
47     return 0;
48 }

 

其中readcodes()函数用来读取编号,readint()函数用来读取c位二进制字符并转化为整数(val);

如何处理“编码文本可由多行组成”

 1 bool readcodes()
 2 {
 3     memset(code, 0, sizeof(code));//清空数组
 4     code[1][0] = readchar();//输入开始;单个字符输入
 5     for(int len = 2; len <= 7; len++)
 6     {
 7         for(int val = 0; val < (1<<len)-1; val++)
 8         {
 9             int ch = getchar();
10             if(ch == EOF)   return 0;
11             if(ch == '\n' || ch == '\r')    return 1;
12 
13             code[len][val] = ch;
14         }
15     }
16     return 1;
17 }
18 int readint(int c)
19 {
20     int v = 0;
21     while(c--)
22         v = v*2+readchar()-'0';
23     return v;
24 }

readchar()函数代码如下:

1 int readchar()
2 {
3     for(;;)
4     {
5         int ch = getchar();
6         if(ch != '\n' && ch != '\t')    return ch;
7     }
8 }

 

另外,Printcodes()函数本身对题目没有要求,但是对于调试代码是有用的。