What Are You Talking About杭电1075 map.

伊格内修斯很幸运,他昨天遇到了一个火星人。但他不知道火星人使用的语言。火星人给了他一本火星历史书和一本字典当它离开时。现在伊格内修斯想把历史书翻译成英语。你能帮助他吗? 
输入 
这个问题只有一个测试用例,测试用例由两个部分组成,字典部分和book部分。字典部分从单行开始,包含一个字符串“开始”,这个字符串应该被忽略,然后一些行跟随,每一行包含两个字符串,第一个是英语单词,第二个是在火星语中对应的单词。带有单个字符串“END”的一行表示目录部分的结束,而该字符串应该被忽略。书的部分开始于一行包含一个字符串“开始”,这个字符串应该被忽略,然后是用火星语言写的文章。你应该用字典把这篇文章译成英语。如果你在字典里找到这个词,你应该翻译它,把生词写在你的译文里,如果你找不到字典里的词,你就不用翻译它,只要把旧的字复制到你的翻译上就行了。空格(’ ‘),标签(’ \t ‘),输入(’ \n ‘),所有的标点符号都不应该翻译。一行有一个字符串“END”表示book部分的结尾,这也是输入的末尾。所有单词都在小写字母中,每个单词最多包含10个字符,每行包含最多3000个字符。 
输出 
在这个问题上,你必须输出历史书的翻译。

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<map>
using namespace std;
const int M=3e5;
char s[M];
map<string,string> m;
int main() {
 string a,b;
 cin>>a;
 while(cin>>a,a!="END") {
  cin>>b;
  m[b]=a;

 }

 map<string,string>::iterator it =m.begin();
 cin>>a;
 getchar();
 while(gets(s),strcmp(s,"END")) {
  int len=strlen(s);
  string temp;
  int i=0,j=0;
  while(i<len) {
   if(s[i]>='a'&&s[i]<='z') {
    temp+=s[i++];
   } else {
    map<string,string>::iterator it=m.find(temp);
    if(it!=m.end()) {
     cout<<it->second;
    } else cout<<temp;
    while(i<len&&(s[i]<'a'||s[i]>'z')) {
     printf("%c",s[i]);
     i++;
    }
    temp.clear();
   }
  }
  cout<<endl;
 }
 return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40835329/article/details/81533408