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

【链接】 我是链接,点我呀:)
【题意】

给你每个字母对应的摩斯密码。
然后每个单词的莫斯密码由其组成字母的莫斯密码连接而成。
现在给你若干个莫斯密码。
请问你每个莫斯密码对应哪个单词。
如果有多个单词和他对应。那么输出字典序最小的那个。
如果没有单词和他对应。
那么,你可以删除或者添加若干字母(只能一直删或一直增加)
问你在这种情况下能匹配到的单词(要求添加或者删的单词的数量最小)
如果有多种可能。输出字典序最小的。

如果一直删除。一直增加也找不到。
那么输出所有单词里面字典序最小的哪个。

【题解】

模拟就好。
先对字典排个序再模拟。

【代码】

#include <bits/stdc++.h>
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
using namespace std;

const int N = 1e3;

int n;
string s;
string dic[300];
vector<pair<string,string> > v;

string _find(string s){
    int step = 0;string ans = "";
    rep1(i,0,(int)v.size()-1){
        if (v[i].second==s) {
            if (step==0) ans = v[i].first;
            step++;
        }
    }
    if (step>0){
        if (step>1) ans+="!";
        return ans;
    }
    step = -1;

    int len1 = s.size();
    rep1(i,0,(int)v.size()-1){
        int len2 = v[i].second.size();
        if (len2<len1){
            string temp = s.substr(0,len2);
            if (temp==v[i].second){
                if (step==-1){
                    step = len1-len2;
                    ans = v[i].first;
                }else if (len1-len2<step){
                    step = len1-len2;
                    ans = v[i].first;
                }
            }
        }else{
            //len2>=len1
            string temp = v[i].second.substr(0,len1);
            if (temp==s){
                if (step==-1){
                    step = len2-len1;
                    ans = v[i].first;
                }else if (len2-len1<step){
                    step = len2-len1;
                    ans = v[i].first;
                }
            }
        }
    }
    if (step==-1) ans = v[0].first;
    ans+="?";
    return ans;
}

int main(){
    //freopen("/home/ccy/rush.txt","r",stdin);
   // freopen("/home/ccy/rush_out.txt","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0);
    while (cin >> s){
        if (s[0]=='*') break;
        string cor;
        cin >> cor;
        dic[s[0]] = cor;
    }
    while (cin >> s){
        if (s[0]=='*') break;
        string temp = "";
        rep1(i,0,(int)s.size()-1){
            temp += dic[s[i]];
        }
        v.push_back({s,temp});
    }
    sort(v.begin(),v.end());
    while (cin >> s){
        if (s[0]=='*') break;
        cout<<_find(s)<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/AWCXV/p/9879080.html

时间: 2024-10-13 23:43:30

【习题 4-6 UVA - 508】Morse Mismatches的相关文章

UVA - 508 Morse Mismatches

Morse Mismatches Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still used in international radio communi

UVa 508 Morse Mismatches (模糊暴力)

题意:莫尔斯电码,输入若干个字母的Morse编号,一个字典和若干编码.对于每个编号,判断它可能的是哪个单词, 如果有多个单词精确匹配,输出第一个单词并加一个“!”:如果无法精确匹配,那么在编码尾部增加或删除尽量少的字符, 使其匹配某个单词并加上“?”. 析:第一次做的时候,一看啥呀,做不了,现在回来看看,发现可以做了,可以使用STL的map来做,首先先把每个字母做一个map, 然后把字典做一个map,最后输入时暴力一下,每个都找一下,这个增加字符可以这样想,就是在和字典比较时,短的在长的字符串中

uva 508

模拟题,最大的坑就是正确理解题意,我英语太菜,读了两遍都没弄懂题意,于是边写边读题才弄明白,但最后还是没读出"无论是有多个相同还是模糊匹配都是按字典序输出第一个",以为是按输入顺序输出第一个,结果跪了,还有就是模糊匹配只有把那个不完整的 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <map> #in

习题3-5 Puzzle UVA - 227

这题太能卡人了,都是输入输出卡的. 1.输入的5X5矩阵中,有时一行最后有多个空格和回车 2.输出格式中,每两个输出结果之间间隔一个空行,但是最后一个结果之后没有空行. 3.有时到第四位元素,直接不按空格,直接换行了. 其实思路很简单,先判断是否运动越界,如果是的话就输出无答案,如果没越界,就依次将空格和目标位置元素相互交换. 下面是AC代码,就是把这些小BUG修修补补改出来的,抛砖引玉吧. #include <bits/stdc++.h> #define N 7 #define M_N 10

算法竞赛入门经典第二版第三章习题

写这个的原因是看到一位大神的习题答案总结,于是自己心血来潮也想写一个这个,目的主要是督促自己刷题吧,毕竟自己太弱了. 习题3-1 得分 UVa 1585 大致就是设置一个变量记录到当前为止的连续的O的数量,碰到X就变0,水题. #include<stdio.h> #include<ctype.h> #include<string.h> char s[90]; int main(void) { int length,n,sum,num; scanf("%d&qu

【转】[专题学习][计算几何]

原文地址:http://www.cnblogs.com/ch3656468/archive/2011/03/02/1969303.html 基本的叉积.点积和凸包等东西就不多说什么了,网上一搜一大堆,切一些题目基本熟悉了就差不多了. 一些基本的题目可以自己搜索,比如这个blog:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 接下来,研究了半平面交,思想方法看07年朱泽园的国家队论文,模板代码参考自我校大牛韬哥: http://www.o

组合计数&#183;棋盘统计

相关习题: 1. Uva 10237 Bishops 题意:两个象不攻击,当且仅当它们不处在同一条斜线上.输入整数$n(n \leq 30)$,统计在一个$n \times n$的棋盘上放$k$个互不攻击的象有多少种方法.如$N=8, k = 6$时有$5599888$种.

算法竞赛入门经典 第四章

[√ ] UVA1339 古老的密码 Ancient Cipher [√ ] UVA489 刽子手的游戏 Hangman Judge [√ ] UVA133 救济金发放 The Dole Queue [√ ] UVA213 信息解码 Message Decoding [√ ] UVA512 追踪电子表格中的单元格 Spreadsheet Tracking [√ ] UVA12412 师兄帮帮忙 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)

UVa第五章STL应用 习题((解题报告))详细!

例题5--9 数据库 Database UVa 1592 <strong><span style="font-size:18px;"><span style="font-size:18px;"><strong><span style="font-size:18px;">#include<iostream> #include<string> #include<