UVa213 - Message Decoding 题解
题目
题目链接
题目大意
太长了 不想翻译。
大概就是告诉你一个编码规则的规则,然后输入编码规则,再输入编码后的数据,再输入读取编码的规则,要你输出解码后的数据。
样例输入
TNM AEIOU
0010101100011
1010001001110110011
11000
$#**\
0100000101101100011100101000
样例输出
TAN ME
##*\$
题解
这编码规则的规则明显就是符合2进制的,所以能用二元组(len, value)来保存一个编码,其中len是编码长度,value是编码对应的10进制的值。
着急赶回宿舍,所以火速写完题解。
Then show the code.
#include <stdio.h>
#include <string.h>
char codes[8][1<<8];
//读取一个非回车的字符
char readchar(){
char ch;
while(1){
ch = getchar();
if(ch == '\n' || ch == '\r') continue;
return ch;
}
}
//读取v位的2进制 并转化为10进制
int readint(int v){
int a=0;
for(int i =0; i<v; i++){
a = a*2 + (readchar() -'0');
}
return a;
}
//读取编码头
int readcodes(){
//第2组以及之后的数据如果直接getchar()会读到一个回车 所以要readchar()
codes[1][0] = readchar();
char ch;
for(int len=2; len<=7; len++){
for(int i=0; i<(1<<len)-1; i++){
ch = getchar();
if(ch == '\n' || ch == '\r') return 1;
if(ch == EOF) return 0;
codes[len][i] = ch;
}
}
return 1;
}
int main(){
while(readcodes()){
while(1){
int len = readint(3);
if(len == 0) break;
while(1){
int v = readint(len);
if(v == (1<<len)-1) break;
putchar(codes[len][v]);
}
}
putchar('\n');
}
return 0;
}
不忘初心方得始终