题目
考虑下面01串序列:
0,00,01,10,000,001,010,011,100,101,110,0000,0001,…,1101,1110,00000,…
首先是长度为1的串,然后是长度为2的串,依次类推。可以将此串看作二进制串。注意:上述序列不存在全为1的串。
编写一个解码程序。
首先输入一个编码头(eg:AB#TANCnrtXc),则上述序列的每个串依次对应编码头的每个字符。(eg:0对应A,00对应B,#对应01,T对应10,依次类推)
编码文本由多个小节组成,每个小节的前3个二进制数代表字符编码的长度(eg:010对应长度为2),然后是各字符编码,以全1结束(eg:编码长度为2,就以11结束)。编码文本以000的小节结束。

我先讲解一下位运算
"<<"左移运算,“>>”右移运算
eg:1<<8 即1✖2的8次幂
eg1>>8 即1➗2的8次幂
一个n位的二进制数,最大数为n个1
eg:8位的二进制数最大数为11111111(8个1)
将上述n位最大的二进制数,转换位十进制用位运算来计算
即(1<<n)-1
eg:111转换位十进制(1<<3)-1{2的3次幂减去1为7}

这道题的整体思路:
先用readcodes()读取编译头,并且存放到code[len][value]数组中,再读取编译文本,将编译文本用readint()方法转换为十进制数,在对应到code[len][value]中的值,并将其输出!其中的代码细节我都写在了注释里,以便大家详细阅读!

#include <iostream>
using namespace std;
int code[8][1<<8];//开一个code用于存放编译头
//code[len][value],len位二进制有多少位,eg:001即三位最大为8位,1<<8为左移的位运算(位运算写在代码块下边的讲解部分)//readchar()防止输入数据中有换行符
int readchar()
{for(;;){int ch=getchar();if(ch!='\n'&&ch!='\r')return ch;//只要不为换行符,就返回ch的ASCII码值}
}
//将c位的二进制数转换为十进制
int readint(int c)
{int v=0;while(c--){v=v*2+readchar()-'0';//eg:110=(1*2+1)*2+0}return v;
}//读取编译头,将编译头中的字符,存放到code[len][value]中int readcodes(){memset(code,0,sizeof(code));//清空数组code[1][0]=readchar();//因为第一个二进制只有一位0,所以单独拿出来读取for(int len=2;len<=7;len++){for(int i=0;i<(1<<len)-1;i++)//i小于len位二进制转十进制后的"最大数"{int ch=getchar();if(ch==EOF)return 0;//EOF表示读取结束if(ch=='\n'||ch=='r')return 1;//遇到换行,接着读取code[len][i]=ch;//将ch归位}}return 1;}
int main()
{while(readcodes())//读取预编译头{//printcodes()//可以把注释去掉方便调试for(;;){int len=readint(3);//读取编译文本的前三位,即小节中的编码长度if(len==0)break;//当这段二进制小节有0位,直接breakfor(;;){int v=readint(len);//往后读取len位二进制数,v存放所对应的十进制数if(v==(1<<len)-1)break;//当读到有len个1时,证明读取到这小节的末尾,直接break跳出循环putchar(code[len][v]);//不然输出有len位,十进制为v的char型字符}}putchar('\n');}return 0;
}

谢谢大家观看,多多点赞支持!

信息解码(ACM)刘汝佳相关推荐

  1. (转)刘汝佳书上出现的一些题目

    推荐一些题目,希望对参与ICPC竞赛的同学有所帮助. POJ上一些题目在 http://162.105.81.202/course/problemSolving/   可以找到解题报告.        ...

  2. 刘汝佳《算法竞赛入门经典》---总结

    刘汝佳:<算法竞赛入门经典> 三步: 基本的数据结构+算法知识: 数论等数学基本知识: 锻炼联想建模能力.知识与实际相结合,解决实际问题! 第一章:程序设计入门 1.a/b 当a.b为整数 ...

  3. [转]ACM-ICPC比赛随想——刘汝佳

    自己接触acm也这么久了,到底我们acmer这般为acm废寝忘食值不值得???个人觉得刘汝佳的这篇文章讲的非常好... 刘汝佳,1982年12月生,毕业于重庆外国语学校,清华大学计算机科学与技术系20 ...

  4. 刘汝佳《算法竞赛入门经典(第二版)》习题(三)

    刘汝佳<算法竞赛入门经典(第二版)>第三章习题(一) 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 给出一个由O和X组成的串(长度为1~80),统计得分.每个 ...

  5. 刘汝佳《算法竞赛入门经典(第二版)》习题(六)

    刘汝佳<算法竞赛入门经典(第二版)>第四章习题(4-1~4-3) 习题4-1 象棋(Xiangai,ACM/ICPC Fuzhou 2011,UVa1589) 考虑一个象棋残局,其中红方有 ...

  6. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

  7. 【刘汝佳】习题3-1 UVA1585

    刘汝佳 <算法竞赛入门经典(第二版)>第三章习题 3-1 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 给出一个由O和X组成的串(长度为1~80),统计得分. ...

  8. 刘汝佳算法竞赛第二版习题3-2思路

    最近在看刘汝佳编写的紫皮算法书,第三章后面有个习题,尝试写了一下,总感觉能找到更加便利的解题方法,但能力有限没想到. 上网搜索了一下,也没找到能让我眼前一亮的方法,那就暂且把我写的shi山放出来让大伙 ...

  9. ACM-ICPC比赛随想——刘汝佳

    -------------------------------– 作者简介:刘汝佳,1982年12月生,毕业于重庆外国语学校,清华大学计算机科学与技术系2005级研究生.高二时创立"信息学初 ...

最新文章

  1. leetcode 1035. 不相交的线(dp)
  2. 对于使用progisp软件进行ISP编程时进入不了编程模式的解决方法
  3. OllyDBG完美教程(超强入门级)
  4. Elasticsearch7.15.2 mysql8.0.26 logstash-input-jdbc 数据全量索引构建
  5. python测试工具开发面试宝典3web抓取
  6. 微服务面试必问的Dubbo,这么详细还怕自己找不到工作?
  7. java程序设计_Java程序设计--接口interface(笔记)
  8. 通信服务器系统安装,pxe网络安装操作系统
  9. Visio 安装后提示 Dos 共享冲突
  10. 2018南邮全国计算机大赛,我院承办2018全国大学生物联网设计竞赛(TI杯)南京邮电大学选拔赛...
  11. 环洋市场咨询:全球OLED收入预计2028年达到502.4亿美元
  12. 论文写作 之 Related work
  13. /etc/rc0.d----rc3.d---rcS.d这些目录的意义
  14. ECShop后台详解-模块管理、基本信息设置、商品展示、促销管理、订单管理、文章管理、报表统计、数据备份与还原
  15. 【分享】免梯子的GPT,玩 ChatGPT 的正确姿势
  16. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
  17. cesium建筑物3DTile单体化(cesium篇.24)
  18. 商城项目---(一)搭建
  19. Vitalik Buterin 《以太坊紫皮书》
  20. AC自动机 从入门到模板

热门文章

  1. 在windows上用vscode打造比vc++6.0好用的C/C++ IDE,适用编程小白
  2. 初学者必看!3D建模要学什么软件?
  3. 高等数学强化2:一元函数微分学 中值定理 极值点 拐点
  4. 实况足球2017 for mac打不开怎么办?10.13系统无法运行实况足球2017 for mac是什么原因?
  5. 什么是低代码开发,为何大企业都选择低代码来做数字化?
  6. jQuery操作数组、Ajax
  7. 《矩阵论》学习笔记(五):第五章 特征值的估计及对称矩阵的极性
  8. 三菱PLC怎么控制变频器
  9. [磁盘清理] Windows Server 2003 系统盘清理
  10. mysql将%3c%3e转义_ESAPI学习笔记