zoj_1109 Language of FatMouse

We all know that FatMouse doesn't speak English. But now he has to be prepared since our nation will join WTO soon. Thanks to Turing we have computers to help him.

Input Specification

Input consists of up to 100,005 dictionary entries, followed by a blank line, followed by a message of up to 100,005 words. Each dictionary entry is a line containing an English word, followed by a space and a FatMouse word. No FatMouse word appears more than once in the dictionary. The message is a sequence of words in the language of FatMouse, one word on each line. Each word in the input is a sequence of at most 10 lowercase letters.

Output Specification

Output is the message translated to English, one word per line. FatMouse words not in the dictionary should be translated as "eh".

Sample Input

dog ogday
cat atcay
pig igpay
froot ootfray
loops oopslay

atcay
ittenkay
oopslay

Output for Sample Input

cat
eh
loops
 
Time Limit: 10 Seconds      Memory Limit: 32768 KB
 
分析:
        本题是词典搜索问题。起初想用数组来存储字典,然后将输入的字符串与字典中的字符串一一对比,如果有匹配单词,则输出单词,否则输出“eh”。但是考虑到有100 005个词条,这样肯定会超时。如何解决超时问题呢?

        Tip1:映照容器map
        map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间一一对应。map映照容器的数据结构采用红黑树(类似二叉平衡搜索树)来实现的,插入元素的键值不允许重复,比较函数只对元素的键值进行比较,元素的各项数据也通过键值检索出来。
       将元素插到map中去的时候,采用默认比较函数,即按键值由小到大的顺序插入元素。
       常用函数:删除erase(键值),查找find(键值)
  
       Tip2:采用gets()输入
       采用gets()输入比getline()快的多,但是gets()不能从cin中读取数据。
       用法:从stdin流中读取字符串,直至接受到换行符或EOF停止。并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为’\0'并由此来结束字符串。
       注意:本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。
     
        Tip3:采用sscanf输入
        因为gets()不能从cin中读取数据,所以采用sscanf。
        sscanf与scanf类似,只是后者以屏幕(stdin)即键盘为输入源,前者以固定字符串为输入源,默认以空格来分开字符串。

原型: int sscanf (const char *str,const char * format,var1,var2...);

说明: sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。转换后的结果存于对应的参数内。 成功则返回参数数目,失败则返回0。

答案:

#include<iostream>
#include<string>
#include<cstdio>
#include<map>
using namespace std;
int main()
{
    string s;
    char ss[100],s1[100],s2[100];//每行字符串,释义,词条
    int x,y;
    map<string,string> m;//声明映照容器,键值与映照数据的类型都是string
    map<string,string>::iterator p;//迭代器,用于遍历的指针
    //while(getline(cin,s))
    while (gets(ss))
    {
        s=ss;
        //如果读入一行为空行(只包含一个回车符)则结束循环
        if(s=="")break;
        else
        {
            //在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
            sscanf(s.c_str(),"%s %s",s1,s2);
            m[s2]=s1;
        }
    }
    while(gets(ss))
    {
        s=ss;
        p=m.find(s);//从映照容器中查找键值
        if(p!=m.end())
        cout<<m[s]<<endl;
        else cout<<"eh"<<endl;
    }
    return 0;
}


                 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值