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;}
- UVA 508 莫尔斯电码,map的妙用,函数的组合
- 莫尔斯电码的趣事
- UVa 508 Morse Mismatches(莫尔斯电码)
- 4-6 UVA 508 Morse Mismatches莫尔斯电码
- 莫尔斯电码
- 莫尔斯电码
- 算法竞赛入门经典(第2版)习题4-6 莫尔斯电码 Morse Mismatches UVa 508
- [密码学外篇]莫尔斯电码
- 树莓派作品2_莫尔斯电码
- 习题4-6 莫尔斯电码 UVa508
- uva508 莫尔斯电码(Morse Mismatches)
- 莫尔斯电码与信息传输
- Database(map的妙用) - uva 1592
- UVa 1592Database(map的妙用)
- map的妙用
- map的妙用
- Unix组合命令的妙用
- UVA 11624 BFS的妙用
- SpringMVC的视图解析器
- HDU6029-Graph Theory
- [codewars]2.编写一个maskify函数,把字符串除了后四位用“#”代替
- 中国地震台网
- Oracle数据库的deferred_segment_creation和segment creation immediate
- UVA 508 莫尔斯电码,map的妙用,函数的组合
- 语义分割SegNet
- JavaScript创建JSON对象
- 全速前行的专栏
- 初始jsp
- DPCM 压缩系统的实现和分析
- 十道海量数据处理面试题与十个方法大总结
- 9种对肝脏有益的中药
- 浅谈视频会议系统