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

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

分析 :有两个重要点,首先如何建立字符和所给规则二进制之间的一一对应的关系? 在数据可能多行组成的情况下,如何方便地读取数据进行处理? 对于第一个问题,如果使用map那对于0、00、000的情况只能使用字符串形式进行映射,比较麻烦,可以考虑二进制转化为十进制然后用数组,使用len[长度][数值],表示长度表示二进制的长度,数值表示二进制转化为对应十进制的值是多少,然后整个数组的值就是对应的字符。然后在有多行的情况下,可以考虑编写一个readch()函数来跳过‘\n‘和‘\r’读取数据,之后的便很好模拟了。

inline char readch()
{
    int ch;
    while(true){
        ch = getchar();
        if(ch!=‘\r‘ && ch!=‘\n‘) return ch;
    }
}

经验 :多行的读入技巧readch()、二进制长度与十进制数值之间的关系是len = pow(2, n) - 1,且题目中不包含全1的二进制的话,那就是从0~pow(2, n)-2递增了。

#include<bits/stdc++.h>
using namespace std;
int len[8][128];
inline char readch()
{
    int ch;
    while(true){
        ch = getchar();
        if(ch!=‘\r‘ && ch!=‘\n‘) return ch;
    }
}
int getcode()
{
    memset(len, 0, sizeof(len));
    len[1][0] = readch();
    for(int i=2; i<=7; i++){
        for(int j=0; j<(1<<i)-1; j++){
            int ch;
            ch = getchar();
            if(ch==‘\n‘ || ch==‘\r‘) return 1;
            else if(ch==EOF) return 0;
            else len[i][j] = ch;
        }
    }
}
int readint(int Len)
{
    int ret = 0;
    while(Len--) ret = ret * 2 + (readch() - ‘0‘);
    return ret;
}
int main(void)
{
//    freopen("in.txt", "r", stdin);
    while(getcode()){
        while(true){
            int position = readint(3);
            if(position==0) break;
            while(true){
                int v = readint(position);
                if(v == (1<<position)-1) break;
                putchar(len[position][v]);
            }
        }
        puts("");
    }
    return 0;
}

时间: 2024-08-26 12:33:45

UVa 213 信息解码 (模拟 && 二进制)的相关文章

UVa 213 信息编码!模拟!

背景:一次ac!!而且调试时间也短!!!!看来这个自定义函数,确实是一个好的方法!!构思又清晰,调试又明朗! 思路:一些单一的函数堆砌而成,每个函数有自己的功能. 学习:1.我是采用模拟手算二进制为十进制的方法,而小紫书上给出的方法似乎更简单:(这似乎透露除了字符串数转化普通数的方法)(普通二进制数,转化为十进制数就一位一位的拆分) //assumpt that temp[] have n charnumbers int decimal=0; for(int i = 0;i < n;i++){

UVa 213 Message Decoding(World Finals1991,字符串)

 Message Decoding  Some message encoding schemes require that an encoded message be sent in two parts. The first part, called the header, contains the characters of the message. The second part contains a pattern that represents the message. You must

算法习题---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个,长

遗传算法,实数编码的交叉操作之SBX(模拟二进制交叉)

本文主要介绍遗传算法(实数编码)的交叉操作中的SBX,模拟二进制交叉. 首先,给出个人用python2.7实现的代码,具体模块已上传到: https://github.com/guojun007/sbx_cross 1 #!/usr/bin/env python 2 #encoding:UTF-8 3 import numpy as np 4 import random 5 6 """ 7 SBX 模拟二进制交叉 8 9 输入: 10 population 种群矩阵 11 a

UVa 575 Skew Binary 歪斜二进制

呵呵,这个翻译还是很直白的嘛,大家意会就好. 第一次看到这个高大上题目还是有点小害怕的,还好题没有做过深的文章. 只要按照规则转化成十进制就好了,而且题目本身也说了最大不超过一个int的范围(2^31-1 == 2147483647). 直接位运算就好了.   Skew Binary  When a number is expressed in decimal, the k-th digit represents a multiple of 10k. (Digits are numbered f

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 )

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 ) 题意: 一个书架,原来所有的书都是按顺序摆好的,书的编号从1开始到n 操作: 取出一本书,统计在这本书之前有多少本书,统计完之后,将这本书放在书架的第一位. 如:  1 2 3 4 5取4   4 1 2 3 5 (取之前,有3本书在4前面,取完后,将4放在栈顶)取4   4 1 2 3 5 (取之前,有0本书在4前面,取完后,将4放在栈顶)取2   2 4 1 3 5 (取之前,有2本书在2前面,取完

【UVA】11464-Even Parity(二进制枚举子集)

枚举第一行的所有可能情况,之后根据上面行计算下面行(判断是否冲突),获得最终结果. 14058243 11464 Even Parity Accepted C++ 0.275 2014-08-18 05:14:15 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<stack> #inc

uva 1156 - Pixel Shuffle(模拟+置换)

题目链接:uva 1156 - Pixel Shuffle 题目大意:给定一个N*N的黑白位图,有7种操作,并且对应在指令后加上'-'即为操作的逆,给定N和一系列操作,(从最后一个开始执行),问说这一套指令需要执行多少次才能形成循环. 解题思路:模拟指令执行后获得一个置换,分解成若干的循环,各个循环长度的最小公倍数即使答案. #include <cstdio> #include <cstring> #include <algorithm> using namespace

把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