输入字母的莫尔斯编码、字典,之后输入编码过的单词,要求输出对应的单词。
使用map保存莫尔斯编码,读入字典后,将每个单词的编码保存在vector中并排序。然后对于每个输入莫尔斯编码串,与字典比对进行输出。
紫书书上第四章的题,学过STL之后做更加简单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include<iostream> #include<algorithm> #include<string> #include<vector> #include<map> using namespace std; string s; map<char,string> decode; struct m_word{ string s,s0; m_word(string s="",string s0=""):s(s),s0(s0){} bool operator < (const m_word &x) const { return s0.length()==x.s0.length()?s0<x.s0:s0.length()<x.s0.length(); } }; vector<m_word> dict; string code(){ string s0; for(int i=0;i<s.length();++i){ s0+=decode[s[i]]; } return s0; } int main(){ ios::sync_with_stdio(false); while(1){ char c; cin>>c; if(c=='*') break; cin>>s; cin.get(); decode[c]=s; } while(1){ cin>>s; if(s=="*") break; dict.push_back(m_word(s,code())); } sort(dict.begin(),dict.end()); while(1){ cin>>s; if(s=="*") break; int t=0,cnt; while(1){ cnt=0; for(int i=0;i<dict.size();++i){ if(dict[i].s0==s.substr(0,s.size()-t)){ if(!cnt) cout<<dict[i].s; cnt++; } else if(dict[i].s0.substr(0,dict[i].s0.size()-t)==s){ if(!cnt) cout<<dict[i].s; cnt++; } } if(cnt) break; ++t; } if(t) cout<<"?"; else if(cnt!=1&&!t) cout<<"!"; cout<<endl; } return 0; }
|
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **