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 

转载于:https://www.cnblogs.com/00isok/p/9868019.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值