hdu 1075:What Are You Talking About(字典树,经典题)

What Are You Talking About


Time Limit: 10000/5000 MS
(Java/Others)    Memory Limit: 102400/204800 K
(Java/Others)
Total Submission(s): 12617    Accepted
Submission(s): 4031

Problem Description

Ignatius is so lucky that he met a Martian yesterday.
But he didn‘t know the language the Martians use. The Martian gives him a
history book of Mars and a dictionary when it leaves. Now Ignatius want to
translate the history book into English. Can you help him?

Input

The problem has only one test case, the test case
consists of two parts, the dictionary part and the book part. The dictionary
part starts with a single line contains a string "START", this string should be
ignored, then some lines follow, each line contains two strings, the first one
is a word in English, the second one is the corresponding word in Martian‘s
language. A line with a single string "END" indicates the end of the directory
part, and this string should be ignored. The book part starts with a single line
contains a string "START", this string should be ignored, then an article
written in Martian‘s language. You should translate the article into English
with the dictionary. If you find the word in the dictionary you should translate
it and write the new word into your translation, if you can‘t find the word in
the dictionary you do not have to translate it, and just copy the old word to
your translation. Space(‘ ‘), tab(‘\t‘), enter(‘\n‘) and all the punctuation
should not be translated. A line with a single string "END" indicates the end of
the book part, and that‘s also the end of the input. All the words are in the
lowercase, and each word will contain at most 10 characters, and each line will
contain at most 3000 characters.

Output

In this problem, you have to output the translation
of the history book.

Sample Input

START

from fiwo

hello difh

mars riwosf

earth fnnvk

like fiiwj

END

START

difh, i‘m fiwo riwosf.

i fiiwj fnnvk!

END

Sample Output

hello, i‘m from mars.

i like earth!

Hint
Huge input, scanf is recommended.

Author

Ignatius.L

Recommend

We have carefully selected several similar problems
for you:  1800 1671 1247 1298 1072 


  字典树,经典题

  WA了1次,后来发现是我把要翻译的单词搞错了,如果一个可以翻译的较长的单词包含着另一个可以翻译的较短的单词,这样遍历句子的时候就会先碰到较短的单词,WA的程序会先把这个短单词翻译出来,但实际上这是不对的,应该翻译整个较长的单词,而不是遇到什么就翻译什么。

  我的程序运行时间是281MS,用链表做的,用数组应该会快些。

  题意

  只有一组测试数据,分成两部分。第一部分是字典,给你若干个单词以及对应的翻译,以START开始,END结束;第二部分是翻译部分,给你若干句子,要求你根据上面给出的字典,将火星文翻译成英文,以START开始,END结束。这里翻译的时候,要注意只有字典中有对应翻译的单词才翻译,字典中没有对应翻译的单词以及标点符号空格原样输出。

  思路

  将字典中的火星文单词,也就是右边的单词构造成一棵字典树。在单词结束的节点中存储其对应的英文翻译。输入的时候读取整行,然后遍历每一个字符,将所有字母连续的记录到一个字符数组中,直到遇到一个非英文字母的字符为止,这个时候从字典树中查找这个单词有没有对应的英文翻译,如果有,输出这个翻译,如果没有,输出原来的单词。

  注意

  1.输入方法,我使用的scanf+gets。

  2.不要搞错要翻译的单词,遇到一个非字母的字符算一个单词。

  3.尽量不要使用cin,cout,容易超时

  代码


 1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 #include <malloc.h>
5 using namespace std;
6
7 struct Tire{
8 Tire *next[26];
9 char *trans; //定义一个指向一维数组的指针
10 Tire() //构造函数
11 {
12 int i;
13 for(i=0;i<26;i++){
14 next[i]=NULL;
15 }
16 trans = NULL;
17 }
18 };
19
20 Tire root;
21
22 void Insert(char trans[],char word[]) //将单词word插入到字典树中,并在最后加上翻译trans
23 {
24 Tire *p = &root;
25 int i;
26 for(i=0;trans[i];i++){
27 int n = trans[i]-‘a‘;
28 if(p->next[n]==NULL)
29 p->next[n] = new Tire;
30 p = p->next[n];
31 }
32 p->trans = (char*)malloc(sizeof(char)*11);
33 strcpy(p->trans,word);
34 }
35 void Find(char str[]) //找到对应的翻译并输出,没找到则输出原来的字符串
36 {
37 Tire *p = &root;
38 int i;
39 for(i=0;str[i];i++){
40 int n = str[i]-‘a‘;
41 if(p->next[n]==NULL){
42 printf("%s",str);
43 return ;
44 }
45 p = p->next[n];
46 }
47 if(p->trans==NULL)
48 printf("%s",str);
49 else
50 printf("%s",p->trans);
51 }
52
53 int main()
54 {
55 char word[11],trans[11];
56 scanf("%s",word);
57 while(scanf("%s",word)!=EOF){ //输入字典
58 if(strcmp(word,"END")==0) //遇到结束标记
59 break;
60 scanf("%s",trans);
61 Insert(trans,word); //将单词word插入到字典树中,并在最后加入其翻译
62 }
63 scanf("%s",word);
64 getchar();
65 char str[3001];
66 while(gets(str)){
67 if(strcmp(str,"END")==0)
68 break;
69 int i,j=0;
70 char t[3001]={0};
71 for(i=0;str[i];i++){
72 if(‘a‘<=str[i] && str[i]<=‘z‘){ //检测到的是小写字母
73 t[j++] = str[i];
74 }
75 else{
76 t[j] = ‘\0‘;
77 if(t[0]!=‘\0‘){ //不是空的
78 Find(t); //找到对应的翻译并输出,没找到则输出原来的字符串
79 t[0]=‘\0‘,j=0; //初始化t
80 }
81 printf("%c",str[i]);
82 }
83 }
84 printf("\n");
85 }
86
87 return 0;
88 }

Freecode : www.cnblogs.com/yym2013

时间: 2024-10-28 21:25:08

hdu 1075:What Are You Talking About(字典树,经典题)的相关文章

hdu 1075 What Are You Talking About 字典树 trie

What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K (Java/Others) Total Submission(s): 14703    Accepted Submission(s): 4724 Problem Description Ignatius is so lucky that he met a Martian yesterday. But

HDU 4825 Xor Sum(二进制的字典树,数组模拟)

题目 //居然可以用字典树...//用cin,cout等输入输出会超时 //这是从别处复制来的 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int node[3011111][2]; int tag,m,n,cas=0,T; long long one[64],allone,tmp; //0/1树的加数据操作,增加一个32的数 //其中如果当前位是0,则加左儿子,

hdu 3172 Virtual Friends (并查集 + 字典树)

题目: 链接:点击打开链接 题意: 输入n,给出n行数据,每行有两个字符串,输出关系网络中朋友的个数,n行. 思路: 代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int N = 22; const int M = 200020; struct node { int c; node *chil

HDU 1251 统计难题(字典树模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:给出一些单词,然后有多次询问,每次输出以该单词为前缀的单词的数量. 思路: 字典树入门题. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn = 1000005; 6 7 int num = 0; 8 9 struct Tr

hdu--1251 统计难题(字典树水题)

Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output 对于每个提问,给出以该字符

字典树模板题 POJ 2503

1 #include <cstdio> 2 #include <cstring> 3 4 char en[11],fr[11]; 5 int st; 6 struct Tire{ 7 int next[26]; 8 char eng[11]; 9 }node[200005]; 10 void insert(char *s,int cur) 11 { 12 if(*s){ 13 if(!node[cur].next[*s-'a']) 14 node[cur].next[*s-'a']

HDU 4027 Can you answer these queries? 线段树裸题

题意: 给定2个操作 0.把区间的每个数sqrt 2.求和 因为每个数的sqrt次数很少,所以直接更新到底,用个标记表示是否更新完全(即区间内的数字只有0,1就不用再更新了) #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #incl

trie/字典树几题

以后有好多次看到这地方就过去了, 未亲自实践过. 不过今晚看了一下,感觉trie的思想还算是比较基础的. 感觉这一个链接讲的不错:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/16/2592838.html 顺便水了几道题. 具体列表可见:http://vjudge.net/contest/view.action?cid=47036#overview A:水题啦. 稍微理解下trie就能写出来了. 附个自己写的代码,还是用LRJ书上的非

hdu 1251 统计难题 (字典树入门题)

1 /******************************************************* 2 题目: 统计难题 (hdu 1251) 3 链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 4 算法: 字典树 5 提示: 这题压要用c++提交,G++会超内存 6 *******************************************************/ 7 #include<cstdio> 8

HDU 1251 统计难题(字典树 裸题 链表做法)

Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output 对于每个提