• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
dwtfukgv
博客园    首页    新随笔    联系   管理    订阅  订阅
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;
}

 

posted on 2016-06-09 15:05  dwtfukgv  阅读(1420)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3