UVa 508 Morse Mismatches (模糊暴力)

题意:莫尔斯电码,输入若干个字母的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;
}
原文地址:https://www.cnblogs.com/dwtfukgv/p/5572356.html