• 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=='
    '||c=='
    ')
     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 == '
    ' || c == '
    ') 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('
    ');
    69     }
    70     return 0;
    71 }

     

  • 相关阅读:
    不使用border-radius,实现一个可复用的高度和宽度都自适应的圆角矩形
    实现一个div在浏览器水平居中
    HTML画布(2)
    《10X工作法制》笔记
    消息体的上传格式
    在rpc链路中的工作总结
    同属姓名注入spring报错
    《事实》听后感
    jdk8使用stream对指定值去重以及其他stream用法
    如何写好业务(待续)
  • 原文地址:https://www.cnblogs.com/yxh-amysear/p/8412869.html
Copyright © 2020-2023  润新知