题目就不放上来了,题目意思是说,先给你一个编码头,然后再给你一个01串作为编码文本,编码头每个字母都对应二进制里面的数字,然后01串的开头三个是读取的长度,后面开始读取,如果遇到长度里面都是1的,就结束,再读取后面三位,以三个0结尾。
刚开始本来想着一次性输入编码头,然后再读入01串,因为01串的长度和段数都不确定,所以要接在第一个01串后面凑成一长串,方面读取,但是,后来RE了。后来看紫薯上面的代码,发现要一个一个的读取,对于编码头的读取,则是每次读取一个编码头,就放到一个二维数组里面去,横向指编码头对应的01串的长度,纵向指编码头对应的01串转换成十进制的值。而编码文本的读取,也是一个一个读取,然后再根据要求转换成十进制。
下面的代码是根据紫薯上面的代码敲出来的,放这里作为以后不间断读取01串的样板,还有逐个读取的样板。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
char s[8][1<<8];
int readchar() //实现跨行输入
{
while(1)
{
char ch=getchar();
if(ch!='\n') return ch;
}
}
int readcode()
{
memset(s,0,sizeof(s));
s[1][0]=readchar(); //一个一个字符的读入,然后顺便按照需要的格式存入数组里面去
for(int i=2;i<=7;i++)
{
for(int j=0;j<(1<<i)-1;j++)
{
char ch=getchar();
if(ch==EOF) return 0;
if(ch=='\n') return 1;
s[i][j]=ch;
}
}
return 1;
}
int readint(int c) //将二进制转换成十进制
{
int k=0;
while(c--) k=k*2+readchar()-'0';
return k;
}
int main()
{
while(readcode())
{
while(1)
{
int len=readint(3); //计算长度
if(!len) break;
while(1)
{
int ll=readint(len); //读取对应的二进制,转换成十进制,再对应数组输出相应的字符
if(ll==(1<<len)-1) break;
putchar(s[len][ll]);
}
}
putchar('\n');
}
return 0;
}