zoukankan      html  css  js  c++  java
  • 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] != ''){
    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
    ");
    66         else
    67             printf("%s
    " , word[index]);
    68     }
    69     return 0;
    70 }

    2018-10-29 

  • 相关阅读:
    CS round--36
    Vijos 1002 过河 dp + 思维
    汇编模拟36选7
    1137
    E. Mike and Foam 容斥原理
    Even-odd Boxes hackerrank 分类讨论
    112. 作业之地理篇 最小费用最大流模板题
    1550: Simple String 最大流解法
    Sam's Numbers 矩阵快速幂优化dp
    java.sql.SQLSyntaxErrorException: ORA-01722: 无效数字
  • 原文地址:https://www.cnblogs.com/00isok/p/9868019.html
Copyright © 2011-2022 走看看