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

来源:互联网 发布:mysql workbench 下载 编辑:程序博客网 时间:2024/04/29 20:50

题目链接
题目大意: 先输入字符,和其对应的密码,直到“”结束,你可知判断结束的标志是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
原创粉丝点击