1075:What Are You Talking About

题目链接: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);//此处打印的是空格,换行等特殊字符
        }
    }

}


你可能感兴趣的:(1075:What Are You Talking About)