题目链接:https://vjudge.net/problem/UVA-213

解:这道题网上有很多解法,各有其巧妙之处,get到了很多知识点

1)用二维数组存储编码字符,code[编码长度][编码的十进制表示]

2)用左移来计算二进制,注意 1 << n - 1 等于 1 << (n - 1)

3)  采用getchar()读入编码

总的来说就是关于 二进制和十进制的转化和读入技巧

#include<bits/stdc++.h>
using namespace std;

char s[300],ch;
int sum,flag,q,num;

int main()
{    
    while(gets(s))   //读入编码字符
    {
        while(1)
        {
            sum = 0;      
            for(int i = 2; i >= 0;i--)
            {
                ch = getchar();
                if(ch == '\n') i++;
                else if(ch == '1') sum += pow(2,i);
            }   //sum存储前3位编码的十进制
            if(!sum) break;   //000时结束
            else 
            {
                flag = 0;
                for(int i = 1;i <= sum - 1; ++i)
                    flag += (1 << i) - 1;
            }   //flag存储长度为sum - 1,sum - 2,...,1 的编码共有多少个
            q = (1 << sum) - 1;
            while(1)
            {
                num = 0;
                for(int i = sum - 1; i >= 0; i--)
                {
                    ch = getchar();
                    if(ch == '\n')  i++;   //跳过回车
                    else if(ch == '1') num += pow(2,i);
                }
                if(num == q) break;   //全为1时结束
                else printf("%c",s[flag + num]);
            }
        }
        printf("\n");
        while((ch = getchar()) != '\n' && ch != EOF);   
        //吃光缓冲区,为下一次的编码头输入做清空操作
    }
    return 0;
}