题意:

出自刘汝佳算法竞赛入门经典第四章。

考虑下面的01串序列:

0, 00, 01, 10, 000, 001, 010, 011, 100, 101, 110, 0000, 0001, …, 1101, 1110, 00000, … 首先是长度为1的串,然后是长度为2的串,依此类推。如果看成二进制,相同长度的后 一个串等于前一个串加1。注意上述序列中不存在全为1的串。 你的任务是编写一个解码程序。首先输入一个编码头(例如AB#TANCnrtXc),则上述 序列的每个串依次对应编码头的每个字符。例如,0对应A,00对应B,01对应#,…,110对 应X,0000对应c。接下来是编码文本(可能由多行组成,你应当把它们拼成一个长长的01 串)。编码文本由多个小节组成,每个小节的前3个数字代表小节中每个编码的长度(用二 进制表示,例如010代表长度为2),然后是各个字符的编码,以全1结束(例如,编码长度 为2的小节以11结束)。编码文本以编码长度为000的小节结束。 例如,编码头为$#**\,编码文本为0100000101101100011100101000,应这样解码: 010(编码长度为2)00(#)00(#)10(*)11(小节结束)011(编码长度为3)000(\)111(小节结束)001(编码 长度为1)0($)1(小节结束)000(编码结束)。

分析:

以后可以用一个函数去处理有换行的读入。

 int read()
{
char ch;
while()
{
ch = getchar();
if(ch != '\r' && ch != '\n')
return ch;
}
}

可以用这个函数去处理二进制转换十进制

 int btod(int len)
{
int v= ;
while(len--)
{
v = v * + read() - '';
}
return v;
}

然后注意读入完的代码转换就行 1<<n 等价于 2的n次方。 然后长度为n的编码最多可以存1<<n - 1 个数, 因为全是1的序列是不存在的。

最后放上代码#include <bits/stdc++.h>

using namespace std;
char input[<<];
char code[][<<];
int codelen;
int read()
{
char ch;
while()
{
ch = getchar();
if(ch != '\r' && ch != '\n')
return ch;
}
}
int btod(int len)
{
int v= ;
while(len--)
{
v = v * + read() - '';
}
return v;
}
int trans()
{
int len = , cnt = ;
for(int i = ; i < strlen(input); i++)
{
if(cnt < (<<len)-)
{
code[len][cnt++] = input[i];
}
else
{
cnt = ;
code[++len][cnt++] = input[i];
}
}
return len;
}
void printtest()
{
for(int i = ; i <= codelen; i++)
{
int cnt = ;
while(code[i][cnt])
{
printf("%d %d %c\n",i,cnt,code[i][cnt]);
cnt++;
}
}
}
int main()
{
// freopen("1.txt","r",stdin);
int ok = ;
while(gets(input))
{
memset(code,,sizeof(code));
// puts(input);
codelen = trans();
// printtest();
while()
{
int len = btod(); if(len == )
break;
while()
{
int b = btod(len);
if(b == (<<len)-)
{
break;
}
printf("%c", code[len][b]);
}
}
printf("\n");
getchar();
// 注意这个getchar 是吸收最后一个回车符用的 以后使用getchar()都要注意有没有回车符没被吸收 }
}

UVA 213 信息解码(二进制&位运算)的更多相关文章

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

    题意 :对于下面这个字符串 0,00,01,10,000,001,010,011……. 首先是长度为1的串,然后是长度为2的串,以此类推.不存在全为1的串. 你的任务是编写一个程序.首先输入一个代码头 ...

  2. uva 10718 Bit Mask (位运算)

    uva 10718  Bit Mask  (位运算) Problem A Bit Mask Time Limit 1 Second In bit-wise expression, mask is a ...

  3. 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集

    Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...

  4. UVA - 13022 Sheldon Numbers(位运算)

    UVA - 13022 Sheldon Numbers 二进制形式满足ABA,ABAB数的个数(A为一定长度的1,B为一定长度的0). 其实就是寻找在二进制中满足所有的1串具有相同的长度,所有的0串也 ...

  5. UVA 10718 Bit Mask 贪心+位运算

    题意:给出一个数N,下限L上限U,在[L,U]里面找一个整数,使得N|M最大,且让M最小. 很明显用贪心,用位运算搞了半天,样例过了后还是WA,没考虑清楚... 然后网上翻到了一个人家位运算一句话解决 ...

  6. UVa 1590 IP网络(简单位运算)

    Description   Alex is administrator of IP networks. His clients have a bunch of individual IP addres ...

  7. UVa 818Cutting Chains (暴力dfs+位运算+二进制法)

    题意:有 n 个圆环,其中有一些已经扣在一起了,现在要打开尽量少的环,使所有的环可以组成一条链. 析:刚开始看的时候,确实是不会啊....现在有点思路,但是还是差一点,方法也不够好,最后还是参考了网上 ...

  8. 位运算基础(Uva 1590,Uva 509题解)

    逻辑运算 规则 符号 与 只有1 and 1 = 1,其他均为0 & 或 只有0 or 0 = 0,其他均为1 | 非 也就是取反 ~ 异或 相异为1相同为0 ^ 同或 相同为1相异为0,c中 ...

  9. Java二进制和位运算,这一万字准能喂饱你

    基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...

随机推荐

  1. POJ 2255 Tree Recoveryw(二叉树)

    题目原网址:http://poj.org/problem?id=2255 题目中文翻译: Description 小瓦伦丁非常喜欢玩二叉树. 她最喜欢的游戏是用大写字母构造的随机二叉树. 这是她的一个 ...

  2. Code:Blocks 中文乱码问题原因分析和解决方法

    下面说说修改的地方. 1.修改源文件保存编码在:settings->Editor->gernal settings 看到右边的Encoding group Box了吗?如下图所示: Use ...

  3. python 匿名函数的使用(并没有那么简单)

    以下为几种匿名函数的使用方式:x=[(lambda x:x**2)(x) for x in range(10)]print(x)y=[x**2 for x in range(10)]print(y)i ...

  4. C# System.IO 文件流输入输出

    一.读写文本文件 可以用fileStream来读写文本文件,但是FileStream是通过字节形式来读写数据的,要把字节数据转换为文本,要自己处理编码转换. 对于文本文件的读写,通常用 StreamR ...

  5. Application,Service,Activity 三者的Context的应用场景

    Application 的 context 不是万能的,所以也不能随便乱用,对于有些地方则必须使用 Activity 的 Context, 对于Application,Service,Activity ...

  6. CentOS 6.5上安装GlassFish4.0 过程笔记

    CentOS 6.5上安装GlassFish4.0 过程笔记 1.安装JDK, 注意操作系统的位数, 64 or 32: [root@linuxidc ~]# mkdir /usr/java  [ro ...

  7. sdut1642Simple Arithmetics(模拟)

    链接 发个长长的模拟 这题要注意的地方挺多 -的个数 以及对齐的情况 全都注意好了 大数的加减乘就可以了 #include <iostream> #include<cstdio> ...

  8. LN : leetcode 312 Burst Balloons

    lc 312 Burst Balloons 312 Burst Balloons Given n balloons, indexed from 0 to n-1. Each balloon is pa ...

  9. [ BZOJ 2038 ] Hose

    \(\\\) Description 给出一个数列,多次询问,每次给出一个区间 \([l_i,r_i]\) ,问在区间中随意选两个位置不同的数,是同一个数的概率有多大. \(n,m\le 5\time ...

  10. PHP到浏览器的缓存机制

    参考地址:http://www.cnblogs.com/godok/p/6341300.html 所有的php程序员都知道在php脚本里面执行 echo “1”;访客的浏览器里面就会显示“1”. 但是 ...