题意:莫尔斯电码,输入若干个字母的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 (模糊暴力)的更多相关文章

  1. uva 508 - Morse Mismatches(摩斯码)

    来自https://blog.csdn.net/su_cicada/article/details/80084529 习题4-6 莫尔斯电码(Morse Mismatches, ACM/ICPC Wo ...

  2. uva 508 Morse Mismatches

    Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still us ...

  3. UVA 508 Morse Mismatches JAVA

    题意:输入字母和数字的编码,输入词典,输入一段编码,求出对应的单词. 思路:来自https://blog.csdn.net/qq_41163933/article/details/82224703 i ...

  4. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  5. UVA.129 Krypton Factor (搜索+暴力)

    UVA.129 Krypton Factor (搜索+暴力) 题意分析 搜索的策略是:优先找长串,若长串不合法,则回溯,继续找到合法串,直到找到所求合法串的编号,输出即可. 注意的地方就是合法串的判断 ...

  6. UVA.10986 Fractions Again (经典暴力)

    UVA.10986 Fractions Again (经典暴力) 题意分析 同样只枚举1个,根据条件算出另外一个. 代码总览 #include <iostream> #include &l ...

  7. 【习题 4-6 UVA - 508】Morse Mismatches

    [链接] 我是链接,点我呀:) [题意] 给你每个字母对应的摩斯密码. 然后每个单词的莫斯密码由其组成字母的莫斯密码连接而成. 现在给你若干个莫斯密码. 请问你每个莫斯密码对应哪个单词. 如果有多个单 ...

  8. UVA 270 Lining Up 共线点 暴力

    题意:给出几个点的位置,问一条直线最多能连过几个点. 只要枚举每两个点组成的直线,然后找直线上的点数,更新最大值即可. 我这样做过于暴力,2.7s让人心惊肉跳...应该还能继续剪枝的,同一直线找过之后 ...

  9. uva 10825 - Anagram and Multiplication(暴力)

    题目链接:uva 10825 - Anagram and Multiplication 题目大意:给出m和n,要求找一个m位的n进制数,要求说该数乘以2~m中的随意一个数的结果是原先数各个位上数值的一 ...

随机推荐

  1. block元素和inline元素的特点

    一.block元素的特点 1.处于常规流中时,如果width没有设置,会自动填充满父容器 2.可以设置height/width及margin/padding 3.处于常规流中时,布局在前后元素位置之间 ...

  2. 再识ASCII实体、符号实体和字符实体

    一.前言            相信大家都熟悉通过字符实体   来实现多个连续空格的输入吧!本文打算对三类HTML实体及JS相关操作作进一步的整理和小结,若有纰漏请大家指正,谢谢. 二.初识HTML实 ...

  3. IIS中利用ARR实现反向代理

    反向代理是什么,不了解的,请自行百度.本人也是最近才研究这个主题,简单的来说,利用这项技术可以实现负载均衡,安全控制等web应用中重要的功能,对于web应用来说这是个很基础,也很重要的技术,值得开发者 ...

  4. Linux就业技术指导(一):简历撰写及面试筹备要领

    一,开场 二,模型 三,目标选材 3.1 什么是目标选材 简单说就是确定一个候选人是否符合某一个工作岗位要求的整个流程.这是对招聘方的一个培训,应聘方如果掌握了,就知道应该怎样正确的去应聘工作. 3. ...

  5. Intersecting Lines(叉积,方程)

    Intersecting Lines http://poj.org/problem?id=1269 Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  6. TZOJ 1840 Jack Straws(线段相交+并查集)

    描述 In the game of Jack Straws, a number of plastic or wooden "straws" are dumped on the ta ...

  7. Linux 线程调度

    1.线程sleep()后,会让出cpu的时间片,交由其他线程进行抢占cpu. 线程之间正常的切换是依靠时间片的. 当主线程没有结束,且其在所占有的时间片内,并没有结束自己的工作,此时,子线程将会抢占c ...

  8. 对于局部变量,text、ntext 和 image 数据类型无效

    开发存储过程时报如上错误.大多数人说用varchar(8000)代替text,但值我这里超过8000,不可取 解决: sql2005或以上版本支持新数据类型:varchar(max)nvarchar( ...

  9. Excel单元格内容拆分、合并

    例:如何将EXCEL单元格A1中的“1-2-1”,在B1.C1.D1单元格中分别显示”1“.”2“.”1“.方法一: 在B1中输入“=mid(A1,1,1)”在C1中输入“=mid(AI,3,1)”在 ...

  10. [leetcode]523. Continuous Subarray Sum连续子数组和(为K的倍数)

    Given a list of non-negative numbers and a target integer k, write a function to check if the array ...