• HDOJ 1251 统计难题 Trie


    Trie的写法是很灵活的,感觉跟segment tree一样,要活用

     1 /*
     2 PROG:   统计难题
     3 ID  :   ouyangyewei
     4 LANG:   C++
     5 */
     6 #include <string>
     7 #include <cstdio>
     8 #include <cstdlib>
     9 #include <memory.h>
    10 #include <iostream>
    11 #include <algorithm>
    12 using namespace std;
    13 
    14 struct Trie_Node
    15 {
    16     int  cnt;
    17     Trie_Node *branch[27];
    18     Trie_Node():cnt( 0 )
    19     {
    20         memset( branch, 0, sizeof(branch) );
    21     }// Init
    22 };
    23 
    24 class Trie
    25 {
    26     public:
    27         Trie();
    28         void Trie_Insert( char ss[] );
    29         int  Trie_Find( char ss[] );
    30         
    31     private:
    32         Trie_Node *root;
    33 }t;
    34 
    35 Trie::Trie()
    36 {
    37     root = new Trie_Node();
    38 }// Trie
    39 
    40 void Trie::Trie_Insert( char ss[] )
    41 {
    42     Trie_Node *ptr = root;
    43     Trie_Node *temp = NULL;
    44     int slen = strlen( ss );
    45     for ( int i=0; i<slen ;++i )
    46     {
    47         if ( ptr->branch[ ss[i]-'a' ]==NULL )
    48         {
    49             temp = new Trie_Node();
    50             ptr->branch[ ss[i]-'a' ] = temp;
    51         }
    52         
    53         ++( ptr->branch[ ss[i]-'a' ]->cnt );
    54         ptr = ptr->branch[ ss[i]-'a' ];
    55     }// Insert
    56     
    57     return ;
    58 }// Trie_Insert
    59 
    60 int Trie::Trie_Find( char ss[] )
    61 {
    62     int i, slen = strlen( ss );
    63     Trie_Node *ptr = root;
    64     for ( i=0; i<slen; ++i )
    65     {
    66         ptr = ptr->branch[ ss[i]-'a' ];
    67         if ( ptr==NULL )    break;
    68     }
    69     
    70     if ( i==slen )
    71         return ( ptr->cnt );
    72     else
    73         return 0;
    74 }// Trie_Find
    75 
    76 int main()
    77 {
    78     char vocabu[12];
    79     while ( gets( vocabu ) )
    80     {
    81         if ( !strcmp( vocabu, "" ) )    break;
    82         t.Trie_Insert( vocabu );
    83     }// creat the trie
    84     
    85     while ( EOF != scanf("%s", vocabu) )
    86     {
    87         printf("%d\n", t.Trie_Find( vocabu ));
    88     }// Find the prefix
    89     
    90     return 0;
    91 }
  • 相关阅读:
    Convert、Parse、TryParse、(int)区别及可能引发性能问题
    重写、覆盖、重载、多态几个概念的区别分析
    计算机系统的硬件组成(转)
    如何选择Html.RenderPartial和Html.RenderAction
    位运算(转)
    Java程序员面试中的多线程问题
    请转到控制面板来配置或安装系统组件
    开篇
    DropDownList 不能有多个项被选定!
    有关rollup和cube的使用方法讨论
  • 原文地址:https://www.cnblogs.com/yewei/p/2625788.html
Copyright © 2020-2023  润新知