2015年7月30日 星期四

[UVA] 213 - Message Decoding

題意:
給一個字串,
依序以題目給的key做編碼,
範例輸入的TNM AEIOU
T:0
N:00
M:01
 :10
A:000
E:001
I:010
O:011
U:100
接下來開頭以二進位輸入解碼長度:
010表示接下來輸入以2個一組解碼,
100表示接下來輸入以4個一組解碼,依此類推,
解碼長度000表示結束,
輸入完解碼長度後,會有很多組,輸入都是1表示結束。
範例輸入:
001(長度1進行解碼)0 1(結束) =>T
011(長度3進行解碼)000 111(結束) =>A
010(長度2進行解碼)00 10 01 11(結束) =>N M
011(長度3進行解碼)001 111(結束) =>E
000(結束解碼)
輸出:TAN ME

方法:
先將key都列出來~最多到長度7
以map方式儲存每個字元對應到的編碼,
解碼的時候再照著對應到的字元輸出就可以了!

/* 20150730
 * hanting
 * UVa 213 - Message Decoding
 * C++
 */
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>//count
using namespace std;
string reset(int N)
{
    string str="";
    for(int i=0;i<N;i++)
    {
        str+='0';
    }
    return str;
}
string operator+(string str,int i)
{
    str[str.size()-1]+=1;
    for(int i=str.size()-2;i>=0;i--)
    {
        if(str[i+1]=='2')
        {
            str[i]++;
            str[i+1]='0';
        }
    }
    if(count(str.begin(),str.end(),'1')==str.size())
    {
        str="0"+reset(str.size());
    }
    return str;
}
void BuildKey(vector<string> &key)
{
    key.push_back("0");
    while(key.back().size()<9)
    {
        string last=key.back();
        key.push_back(last+1);
    }

}
int main()
{
    string header;
    vector<string> key;
    BuildKey(key);
    while(getline(cin,header))
    {
        map<string,char> EncodeTable;
        for(int i=0;i<header.size();i++)//編碼頭每個字元依序對應每個code
        {
            char ch=header[i];
            EncodeTable[key[i]]=ch;
        }
        char length[4]={0};
        while(cin>>length[0]>>length[1]>>length[2])
        {
            int codeL=strtol(length,NULL,2);//將010轉成10進位的2
            if(codeL==0) break;//輸入000結束
            while(true)//解碼
            {
                char ch;
                string code="";//將訊息中的01001存起來待等一下解碼
                for(int i=0;i<codeL;i++)
                {
                    cin>>ch;
                    code+=ch;
                }
                if(EncodeTable[code])cout<<EncodeTable[code];
                else break;//編碼111結束解碼
            }
        }
        cout<<endl;
        cin.get();
    }
    return 0;
}

沒有留言:

張貼留言