标签:
题意:莫尔斯电码,输入若干个字母的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