題意:給你26個字母以及0~9對應的摩斯密碼,再給你幾個字符串,輸入摩斯密碼,找到對應的字符串輸出;
題解:
1,使用 map 容器將輸入的東西連接起來。
2,結果出現 ! 時,存在多組字符串與求出的摩斯密碼對應,輸出的應是字典排序中最小的那個再加上’ !‘ 。
3,結果出現 ? 時,輸入的摩斯密碼與所給字符串轉化的摩斯密碼存在差別(只有摩斯密碼的長短不同),輸出的是與所給摩斯密碼長度最相近的那個字符串再加上‘ ? ’。
4,結果只有一個字符串,不存在 ! 和 ? ,直接輸出(此時只有一組字符串與之對應)。
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <map>
#include <vector>
#include <cmath>
using namespace std;
int main()
{
map<char,string> Q;
char c;
while(cin>>c&&c!='*'){
string s; cin>>s;
Q[c]=s;
}
string str;
map<string,string>P;
while(cin>>str&&str!="*"){
for(int i=0;i<str.length();i++){
P[str]+=Q[str[i]];
}
}
string s[10000]; int k=0;
while(cin>>s[k]&&s[k]!="*"){
k++;
}
for(int i=0;i<k;i++){
string ss; int cnt=0;
for(map<string,string>::iterator it=P.begin();it!=P.end();it++){
if(s[i]==it->second){
if(cnt==0)
ss=it->first;
cnt++;
}
}
if(cnt==1) cout<<ss<<endl;
else if(cnt>1) cout<<ss<<"!"<<endl;
else if(cnt==0){
string sl;
int minn=9999999;
for(map<string,string>::iterator it=P.begin();it!=P.end();it++){
if(s[i].substr(0,it->second.length())==it->second||it->second.substr(0,s[i].length())==s[i]){
if(labs(it->second.length()-s[i].length())<minn){
minn=labs(it->second.length()-s[i].length());
sl=it->first;
}
}
}
cout<<sl<<"?"<<endl;
}
}
return 0;
}