版权声明:本人菜鸟一只,如文章有错误或您有高见,请不吝赐教 https://blog.csdn.net/qq_41138935/article/details/82860987
题解:
A,B,#,T,A,N
相对应:
0,00,01,10,000,001,010,011,100,101,110,0000,0001.........1101,1110,00000,..........
例如:
编码头 | $ | # | * | * | \ |
01串 | 0 | 00 | 01 | 10 | 000 |
code[len,value]表示 | [1,0] | [2,0] | [2,1] | [2,2] | [3,0] |
解码:010(长度为2) 00(#) 00(#) 10(*) 11(小结结束) 011(长度为3) 000(\) 111(小结结束) 001(长度为1) 0($) 1(小结结束) 000(结束)
#include<iostream>
#include<cstring>
using namespace std;
int code[8][1<<8];
int readchar(){
for(;;){
int ch=getchar();
if(ch!='\n'&&ch!='\r'){
return ch;
}
}
}
int readcodes(){
memset(code,0,sizeof(code)); //清空数组
code[1][0]=readchar();
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;
cout<<len<<","<<i<<code[len][i]<<endl;
}
}
return 1;
}
int readint(int c){
int v=0;
while(c--){
v=v*2+readchar()-'0';
}
return v;
}
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;
}