UVa 213 -- Message Decoding

Posted Amysear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 213 -- Message Decoding相关的知识,希望对你有一定的参考价值。

 Message Decoding 

simple input

TNM AEIOU
0010101100011
1010001001110110011
11000

$#**\\
0100000101101100011100101000

 

 

Message Decoding - UVALive 5152 - Virtual Judge

 

题意:

  给一个编码头和一串编码(编码可以换行),编码头根据以下规则对应编码{  考虑下面的01串:  0,00,01,10,000,001,010,101,110,0000,0001.....首先是长度为1的串,然后是长度为二的串,以此类推。并且每一段长度的数字从0到(1<<n)-1(第n段)排列,即题目中所说不包括全为1的串。

  编码文本由多个小节组成,每小节前三位数字表示该小节中每个编码的长度(例010表示编码长度为2),然后是各个字符的编码,每小节以全1结束。例第一小节:00101。

  你的任务是编写一个解码程序,将输入的编码转化为对应编码头中字符的句子输出。

  putchar(字符ASCII码)输出字符。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int code[8][1<<8];
 4 int ans[1000];
 5 int readchar()
 6 {//处理换行符,并返回第一个合法字符的ascii
 7     char c = getchar();
 8     while(c==\'\\n\'||c==\'\\r\')
 9     {
10         c = getchar();
11     }
12     return c;
13 }
14 int readcodes()
15 {
16     memset(code,0,sizeof(code));
17     ///需要处理换行符,调用readchar进行处理,并返回第一个合法字符
18     code[1][0] = readchar();//读取第一个不是换行符的字符,
19                             //它的长度为1,编码为0,即为数组的下标
20                             //将其ascii存储在code[1][0]中
21     if(code[1][0] == EOF)
22         return 0;
23 
24     char c;
25     for(int j=2;j<=7;j++)
26     {
27         for(int k = 0;k<(1<<j)-1;k++)
28         {
29             c = getchar();
30             if(c == EOF) return 0;
31             if(c == \'\\n\' || c == \'\\r\') return 1;
32             code[j][k] = c;
33         }
34     }
35     return 1;//读到EOF返回0,结束输入,否则返回1继续输入编码。
36 }
37 int readint(int len)
38 {
39     char c;
40     int sum = 0;
41     for(int i=0;i<len;i++)
42     {
43         c = readchar();
44         sum = sum*2 + (c-\'0\');
45     }
46     return sum;
47 }
48 int main()
49 {
50     while(readcodes())///读取编码头,进行编码
51     {
52         int ansLen = 0;
53         while(1)
54         {
55             int len = readint(3);
56             if(len == 0) break;
57             while(1)
58             {
59                 int c = readint(len);
60                 if(c == (1<<len)-1) break;
61                 ///进行译码
62                 ansLen++;
63                 ans[ansLen] = code[len][c];
64             }
65         }
66         for(int i=1;i<=ansLen;i++)
67             putchar(ans[i]);
68         putchar(\'\\n\');
69     }
70     return 0;
71 }

 

 

以上是关于UVa 213 -- Message Decoding的主要内容,如果未能解决你的问题,请参考以下文章

UVa 213:Message Decoding

uva213 Message Decoding

刷题记录--UVa213 Message Decoding

[UVa 213]Message Decoding,ACM/ICPC World Finals 1991 信息解码

UVa 213 Message Decoding (信息编码)

[算法竞赛入门经典]Message Decoding,ACM/ICPC World Finals 1991,UVa213