7-9 h0136. 在线翻译 (20 分)
您刚刚从毕节搬到了一个大城市。这里的人说的是一门不可理解的外语。幸运的是,您有一本字典可以帮助您理解它们。
输入格式:
输入最多包含100,000个字典条目,后跟一个空白行,然后是最多100,000个单词的消息。每个字典条目都是一行,包含英文单词,后跟一个空格和一个外语单词。在词典中,没有外来词出现多次。该消息是外语单词序列,每行一个单词。输入中的每个单词都是最多10个小写字母的序列。
输出格式:
输出是将消息翻译成英语,每行一个单词。词典中没有的外来词应翻译为“ eh”。
这道题看完一目了然就是用map解决
然而 两个地方卡死我了。记录一下。
第一:
后跟一个空白行
以空白行为结束标志的方法,比赛的时候试了好多好多种方法,气死了呜呜
比如
#include<bits/stdc++.h>
using namespace std;
map<string,string>z;
int main()
{
while(1)
{
string s1,s2;
cin>>s1>>s2;
z[s2]=s1;
getchar();
if(getchar()=='\n')break;
}
while(1)
{
string s;
cin>>s;
if(z.count(s)==1)
cout<<z[s];
else
cout<<"eh"<<endl;
}
return 0;
}
但是这里第一个getchar()把输入完一个字符串后的回车键吸收了,第二个getchar()我都本意是判断输入的是不是又是回车键,结果正常输入的时候它会把我s1的第一个字符给吃掉。 (亨烦!!)
比赛完查博客
发现了这个方法!!!
while(getline(cin,s) && s != "")
就是输入字符串并且要满足这个字符串不是空的“ ”(记好了这个方法!!秒啊秒啊)
巧妙的运用了&&,&&左边接收输入的字符串(可以带空格)并赋值给s,接着&&的右边立马判断输入的是不是空白行。
然后呢可以得到答案了,这个时候。
时间超限了😇😇😇😇😇
我寻思着这不就是个map的事嘛,我想半天发现我把这里改成这样子就对了.....、
⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇
咱就是说,z.count(s)和z.find(s)同样是判断是否存在对应关键字的函数,时间区别这么大吗?!
所以今天咱学到的就是两点
1.在循环输入数据时,善用&&
2.用.count()的地方(判断关键字是否存在)以后改用.find()函数(就是说唯快不破)