UVA 508 莫尔斯电码,map的妙用,函数的组合

题目链接
题目大意: 先输入字符,和其对应的密码,直到“”结束,你可知判断结束的标志是string类型的”“,而不是char类型的‘*’,心都碎了,然后输入许多单词,这相当于一个字典库,然后再输入许多密码串,然后在字典库中找相应的单词。
解题思路:答题的思路不难理解:先把单词和密码意义对应起来,给每一个单词都加密一下,存起来,map的用处,在匹配的过程中,不完全匹配的要注意一下,需要加或者减“末尾!!!”的一些东西,看见大神的做法很巧妙,就给copy学来了。substr()的用法。
注意:在做题时遇见了几个坑点,
1.“” 和‘
2.map的键都是单一的,一开始我把密码当作键,老是不对,flag不是1就是0,找了好久才找到这个隐藏的坑。
3.一开始我把minn当作全局变量,自己测试完全没问题啊,一交就WA,对比大神的代码,才找到,老一会才反应过来,因为不同的字符串,要加或者减的大小也不一样,上一个字符串减去了1,这一个字符串拼了老命也做不到,结果人家minn还不变化,这问题不就来了!!!!
4。最后,坑都是自己挖的,且挖且珍惜啊,成长的宝藏啊

7月28日补充:今天又做了一遍还是没做出来,总结一下原因,一个是关于substr函数的运用根本就没有掌握,还有一点便是,总觉得自己以前做过,凭着自己的印象跑偏了题,题目中要求的是最后加上或者剪掉几个电码,我理解成了加上或者减掉几个字母…
还有便是关于substr()函数,他是string类里面的函数,用法是
s.substr(n, m)截取s字符串中的n~m部分将其组成一个新的字符串作为返回值。
再有便是两个字符串长度相减取绝对值要用labs()用abs()如果括号里里面是负数就会出错
具体原因:s1.size()的返回类型是size_t也就是unsinged int类型,如果两数相减结果为负数的话,就会超过int范围用abs()显然会错,如果用labs()他会自动转成long long类型也就是-1,然后得到结果1,一个帮助理解数据的小程序:

#include<string>
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;

int main()
{
    string s1, s2;
    unsigned int a1, a2;
    long long x;
    while(cin >> s1 >> s2)
    {
    cin >> x;
    cout << (unsigned int)x << endl;
    cin >> a1 >> a2;
    cout << a1 - a2 << endl;
    cout << (s2.size() - s1.size()) << endl;
    cout << labs(int(s2.size()) - int(s1.size())) << endl;
    }
}
#include<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;

int flag;
map<string ,string> Words; // 把单词储存起来,到时候直接查单词就行了;
map<char, string> Mos; // 把字母对应的单词存起来;
map<char, string> :: iterator iter1;
map<string, string>:: iterator iter2;

void encode(string s) // 把单词都转换成莫尔斯码的形式
{
    int len = s.size();
    string ss = "";
    for(int i = 0; i < len; i++)
    {
        iter1 = Mos.find(s[i]);
        ss += iter1 -> second;
    }
    Words.insert(make_pair(s, ss)); // 键为码, 值为单词
}

string made(string s)  // 匹配莫尔斯码和单词
{
    flag = 0;
    string ss;

            for(iter2 = Words.begin(); iter2 != Words.end(); iter2++){
            if(iter2 -> second == s){
                if(flag == 0)
                    ss = iter2 -> first;
                flag++;
            }
        }
    if(flag == 0)
    {
        int minn = 2147483647;
        for(iter2 = Words.begin(); iter2 != Words.end(); iter2++)
        {
            if(s == iter2->second.substr(0,s.size()) || iter2->second == s.substr(0, iter2->second.size()))
            {
                if(labs(s.size() - iter2->second.size()) < minn)
                {
                    minn = labs(s.size() - iter2->second.size());
                    ss = iter2 -> first;
                }
            }
        }
    }
    return ss;
}

int main()
{
    //char ch;
    string keng;
    string str, s;
    while(cin >> keng && keng != "*")
    {
        cin >> str;
        Mos.insert(make_pair(keng[0], str));
    }
    while(cin >> str && str != "*")
    {
        encode(str);
    }
    while(cin >> str && str != "*")
    {
       s = made(str);
      if(flag == 1) cout << s ;
      else if(flag == 0) cout << s << "?" ;
      else if(flag > 1) cout << s << "!" ;
     cout << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值