poj 2804 词典
来源:互联网 发布:sql not in not exists 编辑:程序博客网 时间:2024/06/05 09:12
2804:词典Time Limit: 3000ms Memory Limit: 65536kB
Description
你旅游到了一个国外的城市。那里的人们说的外国语言你不能理解。不过幸运的是,你有一本词典可以帮助你。
Input
首先输入一个词典,词典中包含不超过100000个词条,每个词条占据一行。每一个词条包括一个英文单词和一个外语单词,两个单词之间用一个空格隔开。而且在词典中不会有某个外语单词出现超过两次。词典之后是一个空行,然后给出一个由外语单词组成的文档,文档不超过100000行,而且每行只包括一个外语单词。输入中出现单词只包括小写字母,而且长度不会超过10。
Output
在输出中,你需要把输入文档翻译成英文,每行输出一个英文单词。如果某个外语单词不在词典中,就把这个单词翻译成“eh”。
Sample Input
dog ogdaycat atcaypig igpayfroot ootfrayloops oopslayatcayittenkayoopslay
Sample Output
catehloops
Hint
输入比较大,推荐使用C语言的I / O函数。
-----------------------------------------------------------------------------------------
首先简单采用查找的方法 但是在处理输入的时候遇到问题
由于题中要先输入字典中的内容(n行) 再一个空格 接着才是需要翻译的内容
查看了网上的代码 使用gets()函数比较方便 一个空行的话 gets后得到的字符串为“\0”
其次考虑到对字典进行排序,但是由于字典有原词和解释两个字符串,看到网上有人说可以使用map
使用#include<map>和map<string,string>可以使得原词和解释两个字符串关联起来
但其实使用普通的结构体 再使用排序+二分即可了
------------------------------------------------------------------------
给出百度的qsort()和bsearch()资料
typedef struct str{ char str1[11]; char str2[11];}str,*stri;str strin[100001]=;int compare(const void *a,const void *b){ return strcmp( ((str*)a)->str2 , ((str*)b)->str2 );}qsort(strin,total,sizeof(str),compare);
void *bsearch(const void *key, const void *base, size_t nelem, size_t width, int(*fcmp)(const void *, const *));
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>using namespace std;class dic{public:char engl[12];char fore[12];};int cmp(const void *a,const void *b){return strcmp(((dic *)a)->fore,((dic *)b)->fore);}int search(const void *a,const void *b){return strcmp((char *)a,((dic *)b)->fore);}int main(){dic words[100002];char word[12],ch,tmp[25];int count=0,i,j;dic *p;//读字典gets(tmp);while(tmp[0]!='\0'){for(i=0;tmp[i]!=' ';i++)words[count].engl[i]=tmp[i];words[count].engl[i]='\0';for(j=0,i++;tmp[i]!='\0';i++,j++)words[count].fore[j]=tmp[i];words[count].fore[j]='\0';count++;gets(tmp);}//getchar();qsort(words,count,sizeof(words[0]),cmp);//读文档while(cin>>word&&word){p=NULL;p=(dic *)(bsearch(word,words,count,sizeof(words[0]),search));if(p)cout<<p->engl<<endl;elsecout<<"eh"<<endl;}return 0;}
-------------------------------------------------------------------------------------------
通过本题学习到:
1.c语言中的一些输入处理,输入字符串时如输入空格、空行怎么判断。如果用c语言,判断是否输入结束要用while(scanf("%s",word)!=EOF)
2.如果有关联的两个数组需要排序,可以使用map数据结构,还有用一个结构体(或类)将两个数组中的数据表示出来,再用qsort即可
3.qsort()+bsearch()是常用的组合,用于查找
- poj 2804 词典
- poj 2804 词典 (字典树 或者 快排+二分)
- 百炼 2804 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- 词典
- Mysql ON 子句和 USING 子句
- 学习笔记(十五)
- WorldWind学习系列六:渲染过程解析篇
- juniper 查看端口光功信息
- PrintWriter 和 BufferedWriter
- poj 2804 词典
- CX51 用户手册----FLOATFUZZY 伪指令
- 一些解决方案和实用的工具
- 用WM_NCHITTEST消息欺骗Windows(一)
- 存储过程
- SqlServer2005/2008备份模式与恢复模式 1恢复模式
- uva 101 - The Blocks Problem
- SVN分支合并类型
- 如何获取properties后缀配置文件中的键值对