输入每个字母的Morse编码,一个词典以及若干个编码。对于每个编码,判断它可能是
哪个单词。如果有多个单词精确匹配,任选一个输出并且后面加上“!”;如果无法精确匹
配,可以在编码尾部增加或删除一些字符以后匹配某个单词(增加或删除的字符应尽量
少)。如果有多个单词可以这样匹配上,任选一个添加或者删除最短的那个并且在后面加上“?”。
题目比较简单,没有太多的技巧,可以直接看代码。
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
const int maxd = 10000;
const int inf = 0x3f3f3f3f;
using namespace std;
struct node
{
string dic,morse;
node (){}
node(string s,string s1):dic(s),morse(s1){}
bool operator () (const node a,const node b) const
{
return a.dic<b.dic;
}
}d[maxd];
map<char,string>v;
vector<node>tab;
int main(void)
{
//freopen("input.in","r",stdin);
string s1,s2;
while(cin>>s1&&s1!="*")
{
cin>>s2;
v[s1[0]] = s2;
}
while(cin>>s1&&s1!="*")
{
string s3;
for(int i = 0;i<s1.size();i++)
{
s3 += v[s1[i]];
}
tab.push_back(node(s1,s3));
}
sort(tab.begin(),tab.end(),node());
// for(int i = 0;i<tab.size();i++)
// {
// cout<<tab[i].dic<<endl;
// }
while(cin>>s1&&s1!="*")
{
int flag = 0,flag2 = 0;
int minx = inf;
string ans;
string a,b;
for(int i = 0;i<tab.size();i++)
{
if(s1 == tab[i].morse)
{
if(!flag)
{
cout<<tab[i].dic;
}
flag ++;
}
if(!flag)
{
a = tab[i].morse;
b = s1;
if(a.size()<b.size())swap(a,b);
if(b == a.substr(0,b.size()))
{
int tmp = a.size()-b.size();
if(tmp<minx)
{
minx = tmp;ans = tab[i].dic;
}
}
}
}
if(flag>1)cout<<"!";
else if(!flag)
{
cout<<ans<<"?";
}
cout<<endl;
}
return 0;
}