信息解码,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对应#,……;
  • 接下来是编码文本(可能由多行组成,你应当把它们拼成一个长度的01串);
  • 编码文本由多个小节组成,每个小节的前3个数字代表小节中每个编码的长度(用二进制表示,例如010代表长度为2),然后是各个字符的编码,以全1结束。编码文本以编码长度为000的小节结束;


例如

编码头:$#**\

编码文本:0100000101101100011100101000

解码: 010(编码长度为2)

? 00(#)

? 00(#)

? 10(*)

? 11(小节结束)

? 011(编码长度为3)

? 000(\)

? 111(小节结束)

? 001(编码长度为1)

? 0($)

? 1(小节结束)

? 000(编码结束)


分析

使用二进制,不必以字符串的形式保存编码,只需要把编码理解成二进制,用(len,value)这个二元组来表示一个编码;

其中len是编码长度,value是编码对应的十进制值,用codes[len][value]来保存编码所对应的字符;

代码

#include<stdio.h>
#include<string.h> 

int readchar() {
	for(;;) {
		int ch=getchar();
		if(ch != ‘\n‘ && ch != ‘\r‘) return ch;	// 一直读到非换行符为止
	}
}

int readint(int c) {    //将二进制C转换为十进制数
	int v = 0;
	while(c--) {
		v = v*2 + readchar() - ‘0‘;
	}
	return v;
} 

int code[8][1<<8];    //设置编码头数组,首下标代表示例序列中每个元素的数字个数,尾下标代表在这一列中的字符序号,用位运算表示
int readcodes() {    //生成编码数组
	memset(code, 0, sizeof(code));// 清空数组
	code[1][0]=readchar(); 	//直接调到下一行开始读取。如果输入已经结束,会读到EOF
	for(int len = 2;len<=7;len++) {
		for(int i=0;i<(1<<len)-1;i++) {
			int ch=getchar();
			if(ch==EOF) return 0;
			if(ch==‘\n‘ || ch==‘\r‘) return 1;
			code[len][i]=ch;
		}
	}
	return 1;
}

void printcodes() {		// 输出调试用
	for(int len=1;len<=7;len++) {
		for(int i=0;i<(1<<len)-1;i++){
			if(code[len][i]==0) return;
			printf("code[%d][%d]=%c\n",len,i,code[len][i]);
		}
	}
}

int main() {
	while(readcodes()) {	// 无法读取更多便码头时退出
		 printcodes();
		for(;;) {
			int len = readint(3);
			if(len == 0) break;
			// printf("len=%d\n",len);
			for(;;) {
				int v=readint(len);
			// printf("v=%d\n",v);
				if(v == (1 <<len) - 1) break;
				putchar(code[len][v]);
			}
		}
		putchar(‘\n‘);
	}
	return 0;
}

原文地址:https://www.cnblogs.com/apebro/p/12582347.html

时间: 2024-08-11 04:04:13

信息解码,ACM/ICPC World Finals 1991的相关文章

[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.

[算法竞赛入门经典]Message Decoding,ACM/ICPC World Finals 1991,UVa213

Description 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 write

Puzzle, ACM/ICPC World Finals 1993, UVa227

有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母.一共有4种指令:A, B, L, R,分别表示把空格上.下.左.右的相邻字母移到空格中.输入初始网格和指令序列(以数字0结束),输出指令执行完毕后的网格.如果有非法指令,应输出"Thispuzzle has no final configuration.",例如,图3-5中执行ARRBBL0后,效果如图3-6所示. 写的比较简陋,先写了容器,然后填充,写移动条件. 以下是用C写的源码: #include<stdi

[算法竞赛入门经典] Crossword Answers ACM/ICPC World Finals 1994,UVa232

Description A crossword puzzle consists of a rectangular grid of black and white squares and two lists of definitions (or descriptions). One list of definitions is for "words" to be written left to right across white squares in the rows and the

【转】ACM/ICPC生涯总结暨退役宣言—alpc55

转自:http://hi.baidu.com/accplaystation/item/ca4c2ec565fa0b7fced4f811 ACM/ICPC生涯总结暨退役宣言—alpc55 前言 早就该写这篇文章了,但是也很不想去写.毕竟是为之奋斗了两年的目标,不是说舍得就舍得的.然而,自己毕竟是到了该退的时候了,与其扭扭捏捏,不如挥一挥衣袖,尚落得一份潇洒.回首这两年来,有很多是需要总结的.在这里不分巨细的记录下来,或许有点像流水账,但是更多的,是一份对过去的难忘. 童年 我的ACM/ICPC的生

ACM/ICPC 之 数据结构-邻接表+BFS(TshingHua OJ-无线广播Broadcast)

这道题中若能够构成互不干扰的区域,其构成的图其实就是汉密尔顿路(Hamilton road),因此如果能够观察出来可以直接转化为汉密尔顿路的存在性证明,即便不能观察,我相信ACMer也能转化为BFS问题,这道题是一道很好的图论问题,对考察自己图论的基本功很有帮助. 无线广播(Broadcast) 描述 某广播公司要在一个地区架设无线广播发射装置.该地区共有n个小镇,每个小镇都要安装一台发射机并播放各自的节目. 不过,该公司只获得了FM104.2和FM98.6两个波段的授权,而使用同一波段的发射机

《ACM/ICPC 算法训练教程》读书笔记一之数据结构(堆)

书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了集训队final的意见买的,感觉还是不错滴. 相对于其他ACM书籍来说,当然如书名所言,这是一本算法训练书,有着大量的算法实战题目和代码,尽管小编还是发现了些许错误= =,有部分注释的语序习惯也有点不太合我的胃口.实战题目较多是比较水的题,但也正因此才能帮助不少新手入门,个人认为还是一本不错的算法书,当然自学还是需要下不少

2014 ACM/ICPC Asia Regional Guangzhou Online Wang Xifeng&#39;s Little Plot HDU5024

一道好枚举+模拟题目.转换思维视角 这道题是我做的,规模不大N<=100,以为正常DFS搜索,于是傻乎乎的写了起来.各种条件限制模拟过程 但仔细一分析发现对每个点进行全部八个方向的遍历100X100X100^8 .100X100个点,每个点在走的时候8中选择,TLE 于是改为另一个角度: 以符合要求的点为拐弯点,朝两个垂直的方向走,求出最远的距离.这样只要对每个点各个方向的长度知道,组合一下对应的就OK. 避免了每个点深搜. PS:搜索的时候x,y写反了,导致构图出现问题,以后用[dy][dx]

HDU 5014 Number Sequence(2014 ACM/ICPC Asia Regional Xi&#39;an Online) 题解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5014 Number Sequence Problem Description There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules: ● ai ∈ [0,n] ● ai ≠ aj( i ≠ j ) For sequence a and sequ