您的位置:首页 > 其它

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!!!!!!!!!!!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: