标签:
题意:莫尔斯电码,输入若干个字母的Morse编号,一个字典和若干编码。对于每个编号,判断它可能的是哪个单词,
如果有多个单词精确匹配,输出第一个单词并加一个“!”;如果无法精确匹配,那么在编码尾部增加或删除尽量少的字符,
使其匹配某个单词并加上“?”。
析:第一次做的时候,一看啥呀,做不了,现在回来看看,发现可以做了,可以使用STL的map来做,首先先把每个字母做一个map,
然后把字典做一个map,最后输入时暴力一下,每个都找一下,这个增加字符可以这样想,就是在和字典比较时,短的在长的字符串中,
截取和短的一样的长度的字符串相等,那么就只要比较长的比短的长多少就行了,最后取一个最短的就OK了。至于加“!”和“?”就很简单了。
一开始我看错了,别的都对就是那个“?”不出现,一定要看好题。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f;
map<char, string> morse;
map<string, string> dic;
int judge(string a, string b){
if(a == b) return 0;//相等
if(a.size() > b.size()) swap(a, b);//如果保证a的长度小于b
if(a == b.substr(0, a.size())) return b.size() - a.size();//如果a和b的前边一样,那么就可以增加或删减字符使它们一样,返回长度差
return INF;//如果不一样,那就不能通过增加或删除使它们一样,那么就返回最大值
}
string solve(const string &s){
string ans = "";
int mmin = INF;//初始化
for(map<string, string>:: iterator it = dic.begin(); it != dic.end(); ++it){
int d = judge(s, it->second);
if(!d && !mmin && *ans.rbegin() != ‘!‘){ ans += "!"; return ans; }//说明精确匹配两次了,直接返回就ok了
else if(d <= mmin) ans = it->first;//不精确匹配,
mmin = min(d, mmin);
// if(s == ".--.-.----..") cout << mmin << endl << it->second << endl;
}
if(mmin) ans += "?";//如果是不精确匹配
return ans;
}
int main(){
// freopen("in.txt", "r", stdin);
string s, ch;
while(cin >> ch && ch != "*"){
cin >> s;
morse[ch[0]] = s;//构造字符map
}
while(cin >> s && s != "*"){
for(int i = 0; i < s.size(); ++i)
dic[s] += morse[s[i]];//构造字典
}
// cout << dic["WROTH"] << endl;
while(cin >> s && s != "*")
cout << solve(s) << endl;
return 0;
}
UVa 508 Morse Mismatches (模糊暴力)
标签:
原文地址:http://www.cnblogs.com/dwtfukgv/p/5572356.html