UVA213信息解码

《算法竞赛入门经典》第四章函数和递归中的题目,考察了自定义函数应用和二进制相关内容。(个人认为考察二进制相关知识占多)。

题意:给一个编码头和一串编码(编码可以换行),编码头根据以下规则对应编码{  考虑下面的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码)输出字符。

代码:

#include<bits/stdc++.h>
using namespace std;
int code[8][1<<8];
int readchar(){//跨行读取编码串
    while(1){
        int ch=getchar();
        if(ch!=‘\r‘&&ch!=‘\n‘)
            return ch;
    }
}
int readint(int len){//读取编码串并转化为十进制数字
    int v=0;
    while(len--)
        v=v*2+readchar()-‘0‘;
    return v;
}
int readcode(){//读取编码头并对应到code数组
    memset(code,0,sizeof(code));
    code[1][0]=readchar();
    for(int len=2;len<=7;len++)
        for(int i=0;i<(1<<len)-1;i++){//不能每位都为1,(1<<len)-1。注意括号位置。
            int ch=getchar();
            if(ch==EOF)    return 0;
            if(ch==‘\n‘||ch==‘\r‘)    return 1;
            code[len][i]=ch;
        }
    return 1;//读到EOF返回0,结束输入,否则返回1继续输入编码。
}
int main(){
    while(readcode()){
        while(1){
            int len=readint(3);
            if(len==0)    break;
            while(1){
                int v=readint(len);
                if(v==(1<<len)-1)    break;
                putchar(code[len][v]);
            }
        }
        putchar(‘\n‘);
    }
    return 0;
}
时间: 2024-08-11 04:04:12

UVA213信息解码的相关文章

算法习题---4.4信息解码(UVa213)

一:题目 消息编码方案要求在两个部分中发送一个被编码的消息.第一部分:称为头,包含消息的字符.第二部分包含一个模式 表示信息.你必须写一个程序,可以解码这个消息. (一)题目详细 你的程序的编码方案的核心是一个序列的“0和1”的字符串 . 0, 00, 01, 10, 000, 001, 010, 011, 100, 101, 110, 0000, 0001, . . . , 1011, 1110, 00000, . . .(对应数字个数n,则表示的编码为2^n-1个) 序列中长度为1的1个,长

把vux中的@font-face为base64格式的字体信息解码成可用的字体文件

在最近移动端项目中用到了vux,感觉用着还习惯,当把vux使用到PC端的时候出现了IE浏览器出现,这样的错误信息: CSS3114: @font-face 未能完成 OpenType 嵌入权限检查.权限必须是可安装的. 文件: UwCtGsNCf5NCQ0N.... 然后在IE浏览器页面中的字体图标就没有显示. 原来在vux中weiui_font.less文件中,如下写法: @font-face { font-weight: normal; font-style: normal; font-fa

信息解码,ACM/ICPC World Finals 1991

问题 考虑下面的01串序列: 0, 00, 01, 10, 00, 001, 010, 011, 100, 101, 110, 0000, 0001, --, 1101, 1110, 00000, -- 首先是长度为1的串,然后是长度为2的串,依次推类.如果看成二进制,相同长度的后一个串等于前一个串加1.上述序列中不存在全为1的串: 编写一个解码程序.首先输入一个编码头(例如 AB#TANCnrtXc), 则上述序列的每个串依次对应编码头的每个字符.例如0对应A,00对应B,01对应#,--:

UVa 213,World Finals 1991,信息解码

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=149 紫书P83 解题报告: 思路很巧.每个字符这样记录,由于同一个值可能有好几种对应,比如0,00,000,这样用一个二维数组code[len][v] 记录字符. 二进制再熟悉一遍.扫一遍长度为len的二进制所有数值.for(int v = 0;v<(1<<le

UVa 213 信息解码 (模拟 &amp;&amp; 二进制)

题意 :对于下面这个字符串 0,00,01,10,000,001,010,011--. 首先是长度为1的串,然后是长度为2的串,以此类推.不存在全为1的串. 你的任务是编写一个程序.首先输入一个代码头(例如AB#TANCnrtXc),则上述序列的每个串依次对应编码头的每个字符.例如,0对应A,00对应B,01对应#-,0000对应c.接下来是编码文本(可能由多行组成,你应当把他们拼成一个长长的01串).编码文本由多个小节组成,每个小节的前3个数字代表小节中每个编码的长度,用二进制表示,然后是个字

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

A children's board game consists of a square array of dots that contains lines connecting some of the pairs of adjacent dots. One part of the game requires that the players count the number of squares of certain sizes that are formed by these lines.

算法竞赛入门经典 第四章

[√ ] UVA1339 古老的密码 Ancient Cipher [√ ] UVA489 刽子手的游戏 Hangman Judge [√ ] UVA133 救济金发放 The Dole Queue [√ ] UVA213 信息解码 Message Decoding [√ ] UVA512 追踪电子表格中的单元格 Spreadsheet Tracking [√ ] UVA12412 师兄帮帮忙 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)

php使用session和Cookie保存用户信息

计应134(实验班)詹加全 php中session的用法 PHP中的session默认情况下是使用客户端的Cookie.当客户端的Cookie被禁用时,会自动通过Query_String来传递. Php处理会话的函数一共有11个,我们详细介绍一下将要用到几个函数. 1. session_start 函数功能:开始一个会话或者返回已经存在的会话. 函数原型:boolean session_start(void); 返回值:布尔值 功能说明:这个函数没有参数,且返回值均为true.最好将这个函数置于

dmidecode命令详解(获取硬件信息)

一.dmidecode简介 dmidecode允许你在Linux系统下获取有关硬件方面的信息.dmidecode遵循SMBIOS/DMI标准,其输出的信息包括BIOS.系统.主板.处理器.内存.缓存等等. DMI(Desktop Management Interface,DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行.SMBIOS(System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范.