zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    网络七层
    微信小程序开发工具 常用快捷键
    BZOJ 1026 windy数 (数位DP)
    BZOJ 1026 windy数 (数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3709 Balanced Number (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5572356.html
Copyright © 2011-2022 走看看