給一個字串,
依序以題目給的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;
}
沒有留言:
張貼留言