紫书第一章训练1 D -Message Decoding(UVA213) by 16黄睿博

来源:http://m.blog.csdn.net/article/details?id=70766751

Some message encoding schemes require that an encoded message be sent in two parts. The ?rst part, called the header, contains the characters of the message. The second part contains a pattern that represents the message. You must write a program that can decode messages under such a scheme. 
The heart of the encoding scheme for your program is a sequence of “key” strings of 0’s and 1’s as follows: 
0,00,01,10,000,001,010,011,100,101,110,0000,0001,…,1011,1110,00000,… 
The ?rst key in the sequence is of length 1, the next 3 are of length 2, the next 7 of length 3, the next 15 of length 4, etc. If two adjacent keys have the same length, the second can be obtained from the ?rst by adding 1 (base 2). Notice that there are no keys in the sequence that consist only of 1’s. 
The keys are mapped to the characters in the header in order. That is, the ?rst key (0) is mapped to the ?rst character in the header, the second key (00) to the second character in the header, the kth key is mapped to the kth character in the header. For example, suppose the header is: 
AB#TANCnrtXc 
Then 0 is mapped to A, 00 to B, 01 to #, 10 to T, 000 to A, …, 110 to X, and 0000 to c. 
The encoded message contains only 0’s and 1’s and possibly carriage returns, which are to be ignored. The message is divided into segments. The ?rst 3 digits of a segment give the binary representation of the length of the keys in the segment. For example, if the ?rst 3 digits are 010, then the remainder of the segment consists of keys of length 2 (00, 01, or 10). The end of the segment is a string of 1’s which is the same length as the length of the keys in the segment. So a segment of keys of length 2 is terminated by 11. The entire encoded message is terminated by 000 (which would signify a segment in which the keys have length 0). The message is decoded by translating the keys in the segments one-at-a-time into the header characters to which they have been mapped. 
Input 
The input ?le contains several data sets. Each data set consists of a header, which is on a single line by itself, and a message, which may extend over several lines. The length of the header is limited only by the fact that key strings have a maximum length of 7 (111 in binary). If there are multiple copies of a character in a header, then several keys will map to that character. The encoded message contains only 0’s and 1’s, and it is a legitimate encoding according to the described scheme. That is, the message segments begin with the 3-digit length sequence and end with the appropriate sequence of 1’s. The keys in any given segment are all of the same length, and they all correspond to characters in the header. The message is terminated by 000. 
Carriage returns may appear anywhere within the message part. They are not to be considered as part of the message. 
Output 
For each data set, your program must write its decoded message on a separate line. There should not be blank lines between messages. 
Sample input 
TNM AEIOU 
0010101100011 
1010001001110110011 
11000  
$#**\  
0100000101101100011100101000 
Sample output 
TAN ME\n##*\$

这个题是真的有毒,怪不得大家没人做,其实就是字符串的处理。给你你要发的消息的文字,然后再按照每行2的n次方减一个进行转换。然后就是解决01串是干嘛的。”That is, the message segments begin with the 3-digit length sequence and end with the appropriate sequence of 1’s. “这句就是讲你接下来要扫描几位进行匹配,认识3就够了,三个字符的值代表行数,这几位的值代表列数,全是1就退出,段结束。扫三个字符确定新的行,因为不存在0行,000就退出这个字符串的处理,下一个字符串。 
这个题01串会出现换行符,getchar会扫换行符,要处理下,最后这个要结束了肯定是一行的结束,继续getchar,要不读取不了下一位,调了好久好久才发现是这个错误。 
我的代码仅供参考 
<<是左移的意思,算关于2的很方便的,另外有时卡二分的时候,你用移位要比除法的速度快,移位还是强的,同理&1也是妙用的,判断其二进制位最后一位是不是1

 1 #include<bits/stdc++.h>
 2 char s[10][1025];
 3 char t[520];
 4 using namespace std;
 5 void la(){
 6    int n=1,m=0;
 7    for(int  i=0;t[i];i++){
 8     s[n][m++]=t[i];
 9     if(m+1==(1<<n)){
10         n++;
11         m=0;}
12    }
13 }
14 int main()
15 {while(gets(t)!=NULL){
16     la();
17     int sum=0;
18     for(int i=0;;i++){
19         char c;
20         c=getchar();
21         if(c==‘\n‘)
22         c=getchar();
23         sum=sum*2+c-‘0‘;
24         if(i%3==2&&sum==0)break;
25         if(i%3==2){
26         for(;;){
27         int s1=0;
28         for(int j=0;j<sum;j++){
29         char c;
30         c=getchar();
31         if(c==‘\n‘)
32         c=getchar();
33         s1=2*s1+c-‘0‘;}
34         if((s1+1)==1<<sum)
35         break;
36         else
37         printf("%c",s[sum][s1]);}
38         sum=0;}
39        }
40        printf("\n");
41        getchar();}
42        return 0;
43 }
时间: 2024-10-13 21:59:53

紫书第一章训练1 D -Message Decoding(UVA213) by 16黄睿博的相关文章

《机器学习》西瓜书 第一章 绪论

机器学习绪论 基本术语 基础 模型:泛指从数据中学得的结果 数据集 data set:一组记录的集合 示例 instance/样本 sample:关于一个事件或对象的描述 属性 attribute/特征 feature:反映事件或对象在某方面的表现或性质的事项 属性值 attribute value:属性上的取值 属性空间 attribute space/样本空间 sample space:属性张成的空间即 \(n\) 个特征描述出的 \(n\) 维空间 特征向量 feature vector:

[OpenGL红宝书]第一章 OpenGL概述

第一章 OpenGL概述 标签(空格分隔): OpenGL 第一章 OpenGL概述 1 什么是OpenGL 2 初识OpenGL程序 3 OpenGL语法 4 OpenGL渲染管线 41 准备向OpenGL传输数据 42 将传输数据到OpenGL 43 顶点着色 44 细分着色 45 几何着色 46 图元装配 47 剪切 48 光栅化 49 片元着色 410 逐片元的操作 5 第一个程序深入分析 51 进入main函数 52 OpenGL的初始化过程 初始化顶点数组对象 分配顶点缓存对象 将数

小粉书第一章

开篇啦. 虽然考研很忙,要学习的东西也实在很多,但老师不是说过啦,"入宝山不能空归"呀,所以大萌要麻烦你找到整块的时间开整理,biubiu. 第一章 -- 程序入门设计语言篇 %d  十进制有符号整数 %u  十进制无符号整数 %f  浮点数 %c  单个字符 %s  字符串 %p  指针 %e  指数形式的浮点数 %x,%X  无符号十六进制整数 %0  无符号八进制整数 %% % 例题1-2 输入三位数反转 <1> 025 1 #include<stdio.h&g

大白书第一章

UVA 11292 The Dragon of Loowater(简单贪心) 题意: n条恶龙,m个勇士,用勇士来杀恶龙.一个勇士只能杀一个恶龙.而且勇士只能杀直径不超过自己能力值的恶龙.每个勇士需要支付能力值一样的金币.问杀掉所有恶龙需要的最少金币. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 20000 + 5; 4 int n, m; 5 int night[maxn], dragon[maxn

西瓜书第一章--绪论

1.1引言 我印象最深的一句话就是:机器的分类能力比人强. 我们为什么要学习机器视觉?周志华教授开篇以西瓜的几个属性(比如色泽.根蒂.敲声)来判断一个西瓜是否是好瓜,这些都是靠人的经验完成的. 机器学习即是一门这样的学科,致力于研究通过计算机的手段,利用经验来改善系统自身性能.机器学习的主要研究内容:关于“学习算法”的学问.有了学习算法我们把经验数据传输给他,他就能产生出相对应的模型,在面对新的情况时,模型就会给我们提供一个相应的判断. 机器学习与数据挖掘的关系:很多人一开始被数据挖掘啊,大数据

浅谈对《构建之法——现代软件工程》第一章的理解

---恢复内容开始--- 一.精读第一章后对专业术语的整理 <构建之法——现代软件工程>一书第一章向我们主要介绍了计算机科学的领域.软件工程与计算机科学的关系.软件的特性以及软件工程的定义与组成部分. 1.通过对第一章的学习,我们了解到了软件的 几种分类: 系统软件:操作系统.设备驱动程序.工具软件等 应用软件:办公软件.通信软件.游戏视频软件等 恶意软件:软件病毒等 以及软件的几种特殊性:1.负责性:2.不可见性:3.易变性:4.服从性:5.非连续性: 2.软件工程与计算机科学的关系 首先,

紫书第4章 函数和递归

1  序 系统的整理下第四章的学习笔记.同上次一样,尽量在不依赖书本的情况下自己先把例题做出来.这次有许多道题代码量都比较大,在例题中我都用纯C语言编写,但由于习题的挑战性和复杂度,我最终还是决定在第五章开始前,就用C++来完成习题.不过所有的代码都是能在C++提交下AC的. 在习题中,我都习惯性的构造一个类来求解问题,从我个人角度讲,这会让我的思路清晰不少,希望自己的一些代码风格不会影响读者对解题思路的理解. 其实在第四章前,我就顾虑着是不是真的打算把题目全做了,这些题目代码量这么大,要耗费很

紫书第三章 数组和字符串

1  序 系统的整理下第三章的学习笔记.例题代码是在未看书本方法前自己尝试并AC的代码,不一定比书上的标程好:习题除了3-8百度了求解方法,其它均独立完成后,会适当查阅网上资料进行整理总结.希望本博文方便自己日后复习的同时,也能给他人带来点有益的帮助(建议配合紫书--<算法竞赛入门经典(第2版)>阅读本博客).有不足或错误之处,欢迎读者指出. 2  例题 2.1  UVa272--Tex Quotes #include <stdio.h> int main() { bool log

第10章例题(紫书)

21/21 题目都很基础,有很多题书上讲得比较详细,然后隔得时间有点久,所以具体什么trick都忘了,思路也懒得去回忆,所以将就着放上来了.... 例题10–1 Uva 11582 题意:输入a, b, n让你计算F[a^b]%n;其中这个F[i]是斐波那契数: 题解: 这题是快速幂+找循环节,用什么方法找循环节呢?因为第一个数是0和1,然后当再出现0和1的时候就是出现循环节的时候,然后假如找到了循环节T,然后就有F[n] = F[n % T],预处理找循环节,O(一百万左右),快速幂logn