uva 213 Message Decoding (对输入的处理)

来源:互联网 发布:最新淘宝app官方下载 编辑:程序博客网 时间:2024/06/07 11:37
给一个编码头和一串编码(编码可以换行),编码头根据以下规则对应编码{  考虑下面的01串:  0,00,01,10,000,001,010,101,110,0000,0001.....首先是长度为1的串,然后是长度为二的串,以此类推。并且每一段长度的数字从0到(1<<n)-1(第n段)排列,即题目中所说不包括全为1的串。 编码文本由多个小节组成,每小节前三位数字表示该小节中每个编码的长度(例010表示编码长度为2),然后是各个字符的编码,每小节以全1结束。例第一小节:00101。

你的任务是编写一个解码程序,将输入的编码转化为对应编码头中字符的句子输出。


这个题目由于输入的时候可以换行输入,这样就不能直接输出完所有的01串然后再处理,这道题很巧妙的用了边输入边处理的方法,每次根据需求读入某一段01串。


#include<bits/stdc++.h>using namespace std;char s[1000][1000];void init(string str)//先预处理一下,将给定的字符串用编码的形式储存起来{    int i=0,n=1;    while(i<str.length())    {        for(int k=0;k<((1<<n)-1);k++)        {            s[n][k]=str[i++];            if(i==str.length())                break;        }        n++;    }}int read(int n)//这个函数很重要,很巧妙的处理了换行输入的问题{    int sum=0;    char ch;    for(int i=1;i<=n;i++)    {        scanf("%c",&ch);        if(ch=='\n')        {            i--;            continue;        }        sum=sum*2+ch-'0';    }    return sum;}int main(){    string str;    char ss[11000];    while(getline(cin,str))    {        init(str);        int i=0;        while(1)        {            int len=read(3);//每次输入一小段,边输入边判断是否结束输入            if(len==0)                break;            while(1)            {                int ans=read(len);//同上                if(ans==((1<<len)-1))                    break;                ss[i++]=s[len][ans];            }        }        getchar();        ss[i]='\0';        puts(ss);    }    return 0;}


原创粉丝点击