ZOJ 1109 Language of FatMouse 【Trie树】

<题目链接>

题目大意:

刚开始每行输入两个单词,第二个单词存入单词库,并且每行第二个单词映射着对应的第一个单词。然后每行输入一个单词,如果单词库中有相同的单词,则输出它对应的那个单词,否则输出“eh”。

解体分析:

本题是trie树的模板题,在建树的时候,在每个单词的结尾节点储存对应单词的序号即可。当然,本题用map也可做,但是效率不够高。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6  
 7 const int MAXN = 100010;
 8 const int N = 11;
 9 const int M = 26;
10  
11 struct Node{
12     int index;
13     Node* child[M];
14     Node(){
15         index = -1;
16         for(int i = 0 ; i < M ; i++)
17            child[i] = NULL;
18     }
19 };
20 Node* root;
21  
22 int pos;
23 char word[MAXN][N];
24  
25 void insert(int index , char* str){
26     Node* s = root;
27     int len = strlen(str);
28     for(int i = 0 ; i < len ; i++){
29         int num = str[i]-'a';
30         if(s->child[num] == NULL)
31             s->child[num] = new Node();
32         s = s->child[num];
33     }
34     s->index = index;   //该单词的结束节点记录所对应字符串的序号
35 }
36  
37 int search(char *str){
38     Node* s = root;
39     int len = strlen(str);
40     for(int i = 0 ; i < len ; i++){
41         int num = str[i]-'a';
42         if(s->child[num] == NULL)
43             return -1;
44         s = s->child[num];
45     }
46     return s->index;
47 }
48  
49 int main(){
50     pos = 0;
51     root = new Node();
52  
53     char str[N*3];
54     char tmp[N];
55     int cnt = 0;
56     
57     while(gets(str) && str[0] != '\0'){
58         sscanf(str , "%s %s" , word[cnt] , tmp);
59         insert(cnt++ , tmp);    
60     }
61  
62     while(scanf("%s" , tmp) != EOF){
63         int index = search(tmp);
64         if(index == -1)
65             printf("eh\n");
66         else
67             printf("%s\n" , word[index]);
68     }
69     return 0;
70 }

 

2018-10-29 

posted @ 2018-10-28 23:50  悠悠呦~  阅读(202)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end