题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075
方法:map
思路:一看就是第一反应就是map,后来查了一下还可以用字典树,字典树原来做数学建模的时候搞过一回,有点忘记了,还是用map更方便。如果用map就没什么好说的了,主要是在读入要翻译的文本的时候,一些特殊字符,比如空格换行的处理,我这里借鉴了网上逐个字符判断的一种方法,感觉还可以。由于第一次用map,代码注释的详细一些,将来还备用。
难点:特殊字符处理工作。
#include<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
using namespace std;
int main()
{
string a,b;
map<string,string> mp; //声明一个map
map<string,string>::iterator it; //声明一个map迭代器
cin>>a; //接收SATRT字符串,由于这个字符串是一定要出现的,所以直接接收,无须判断
while(cin>>a) //接受字典大循环
{
if(a == "END") break; //接收到END,直接跳出接收字典大循环
cin>>b; //输入数据
mp[b] = a; //创建字典
}
char s[1000]; //创建字符串数组,注意,由于这里读入的字符比较复杂,先用字符串数组接收
int i = 0;
cin>>a; //接收SATRT,原理同上
getchar(); //接收回车
char c; //结束临时字符
while(c = getchar()) //接收文字大循环
{
if(c >= 'a' && c <= 'z')
s[i++] = c;
else if(c == 'E') //输入的应该是END,所以接收这个字符串和回车然后退出
{
scanf("%s",s);
getchar(); //读入空格换行等字符
break;
}
else
{
s[i] = '\0'; //如果不是上述情况,这说明一个单词已经结束
it = mp.find(string(s)); //查找键值
if(it != mp.end()) //如果查找键值不是end,这说明该键值存在
printf("%s",(it->second).data()); //打印出字典
else
printf("%s",s); //如果没有找到该键值,原样输出
i = 0; //这里i一定要清零,为下一个单词读入做好准备
printf("%c",c);//此处打印的是空格,换行等特殊字符
}
}
}