题目链接:点击打开链接
题意:给你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;
}