HDU 1075 What Are You Talking About
2016-07-22 09:29
423 查看
题目大意:给出一个“翻译-原文”的对应表,然后给出句子,要把句子中的原文都翻译出来。第一个START是开始输入翻译表直到END结束 翻译表输入完毕 第二个START 是开始输入要求你翻译的单词 如果翻译表中有就打印出来并且保留原有符号,空格。如果翻译表中没有就仍然打印输入的直到END结束
解题思路:因为开的时间是5s,所以这里可以采用两种做法 一种是Trie树,一种是map来存储字符串与字符串之间的关系,用Trie过得时间是map过得时间的一半。我这里就先用map来讲解一下吧。
用map来存储字符串之间的关系,这些都不是难点,难点在于有些人可能会纠结于翻译单词的输入问题,这里我们最好一行一行的输入,可以用到C++中的getline,遇到回车符就结束读入。
这样也可以读入空格,然后遍历这一行的所有字符,因为都是小写字母a-z,所有我们这里可以判断如果是小写字母a-z,开个字符串answer来加上这个字符,直到遇到的字符不是小写字母a-z为止。
这里在判断以前的字母组成得单词在翻译表中是否存在,存在输入map对应的字符串,不存在直接输answer,并且把answer命为空,打印出当前遍历的字符。一直到for循环结束
下面就直接上代码吧!!!!!!!!!!!
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <map> #include <cmath> #include <queue> #include <string> using namespace std; map<string,string> m; int main() { string s,str; string value,key,vString; cin>>s;//输入开始 while(cin>>key) { if(key=="END") break; cin>>value; m[value]=key; } cin>>s;//输入开始 getchar();//缓冲 while(getline(cin,vString)) { if(vString=="END") break; int len=vString.size(); string z=""; for(int i=0;i<len;i++)//遍历输入一行的字符串 { if(vString.at(i)>='a'&&vString.at(i)<='z') { z+=vString.at(i); } else { if(m[z].empty()) { cout<<z; } else { cout<<m[z]; } z=""; cout<<vString.at(i); } } cout<<endl; } m.clear(); return 0; }
时间用的差不多1200MS吧
END!!!!!!!!!!!!!!!!!!!
相关文章推荐
- MINIX - 磁盘块和缓冲块
- source insight 添加ns2源码
- Docker学习总结(10)——10分钟玩转Docker
- Docker学习总结(10)——10分钟玩转Docker
- docker安装-使用本地镜像
- linux笔记:RPM软件包管理-yum在线管理
- [李景山php]thinkphp核心源码注释|Memcached.class.php
- 大数相乘
- Spring总结—— IOC 和 Bean 的总结
- Java Bean
- Collection与Collections的区别
- Linux线程同步-----互斥量(Mutex)
- 易语言特征码定位工具源码
- [李景山php]thinkphp核心源码注释|Memcache.class.php
- 2016 Multi-University Training Contest 2 La Vie en rose
- 在线生成myeclipse注册码
- 在线生成myeclipse注册码
- 在线生成myeclipse注册码
- 改进Scala实现贝叶斯算法
- 580BKefa and Company