题意:给出字典,字典含有密文和对应的原文。然后读入密文,密文以START开头,以END结尾,其中有若干行,输出密文翻译后的文本,如果单词在字典中无对应的则按原样输出,也保留所有非英文字母的特殊符号。
输入格式
字典部分以START
开始,以END
结束。
中间部分每行两个单词,第一个是英文,第二个是蒜厂秘籍文字,以单个空格隔开。
接下来是历史书部分,同样以START
开始,以END
结束。
历史书包含若干行文本,如果其中的单词(由连续的英文字母组成)在字典上出现过,且是蒜厂秘籍文字,则把它替换成英文;否则,保留该单词,也保留所有非英文字母的特殊符号。文本长度不超过 10000。
输出格式
原稿翻译后的文本。
样例输入:
START
love abc
you dddd
END
START
i abc dddd!
END
样例输出:
i love you!
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <iterator>
#include <cstring>
#include <map>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main()
{
map<string,string> dict;
string str,str1,str2;
int change=0;
cin>>str;
while(1)
{
cin>>str1;
if(str1=="END")break;
cin>>str2;
dict[str2]=str1;
}
cin>>str;
//getline(cin,str);
cin.sync(); //!cin是不会读入空格和换行的,但我们输完字符串后,换行符扔滞留在输入缓冲区中,接着就被下一句getline读取了。因此必须先清空缓冲区。
while(1)
{
getline(cin,str);
if(str=="END")break;
//str+='\n';
if(change) cout<<endl;
change=1;
string temp="";
int size=str.size(),flag=0;
for(int i=0;i<size;i++)
{
if(str[i]>='A'&&str[i]<='Z'||str[i]>='a'&&str[i]<='z')
{
temp+=str[i];
flag=1;
}
else
{
if(flag)
{
flag=0;
if(dict.count(temp))cout<<dict[temp];
else cout<<temp;
temp="";
}
cout<<str[i];
}
}
if(flag)
{
if(dict.count(temp))cout<<dict[temp];
else cout<<temp;
}
}
}