UVa 508 - Morse Mismatches(查找)

输入字母的莫尔斯编码、字典,之后输入编码过的单词,要求输出对应的单词。

使用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){//构造map。
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博客,格式可能有所偏差。 **