zoukankan      html  css  js  c++  java
  • Trie模板——来源自Luolc2012

     1 /*==================================================*\
     2   [Trie] 字典树
     3   support:
     4         - insert O(L)
     5         - query O(L)
     6         - delete O(L)
     7   Trie[i]存储第i个节点的信息:
     8         next[j]: 下一个字符为j时 对应的节点编号
     9         fa: 父亲节点编号
    10         cnt: 字符出现次数  
    11 \*==================================================*/
    12 
    13 #include <cstdio>
    14 #include <cstring>
    15 #include <iostream>
    16 #include <algorithm>
    17 #include <queue>
    18 #include <vector>
    19 #include <map>
    20 #include <set>
    21 #include <string>
    22 using namespace std;
    23 //----------------------------------------------
    24 #define CL(a,num) memset(a,num,sizeof(a));
    25 #define BtoA(x,y) memcpy(x,y,sizeof(x));
    26 #define eps  1e-12
    27 #define inf  0x7fffffff
    28 typedef    __int64    LL;
    29 //----------------------------------------------
    30 const int Node_max = 100000 + 5;
    31 
    32 struct Node {
    33     int next[26];
    34     // including a...z
    35     int fa, cnt, flag;    
    36 } Trie[Node_max];
    37 // root = Trie[0]
    38 int Trie_size;
    39 #define t_s Trie_size
    40 
    41 int Trie_ins(char str[]) {
    42     int len = strlen(str);
    43     int tmp = 0;
    44     for(int i = 0; i < len; ++i) {
    45         if(!Trie[tmp].next[str[i] - 'a']) {
    46             Trie[tmp].next[str[i] - 'a'] = ++t_s;    
    47             Trie[t_s].fa = tmp;
    48         }
    49         tmp = Trie[tmp].next[str[i] - 'a'];
    50     }
    51     return ++Trie[tmp].cnt;
    52     // let the appear_times of str increase then return it
    53 }
    54 int Trie_query(char str[]) {
    55     //return the appear_times of str
    56     int len = strlen(str);
    57     int tmp = 0;
    58     for(int i = 0; i < len; ++i) {
    59         if(!Trie[tmp].next[str[i] - 'a'])
    60             return -1;    // if can't find str
    61         tmp = Trie[tmp].next[str[i] - 'a'];
    62     }
    63     return Trie[tmp].cnt;
    64 }
    65 int Trie_del(char str[]) {
    66     int len = strlen(str);
    67     int tmp = 0;
    68     for(int i = 0; i < len; ++i) {
    69         if(!Trie[tmp].next[str[i] - 'a'])
    70             return -1; // if can't find str
    71         tmp = Trie[tmp].next[str[i] - 'a'];    
    72     }
    73     return --Trie[tmp].cnt;
    74     // let the appear_times of str decrease then return it
    75 }
    76 int main() {
    77     char str[20];
    78     while(true) {
    79         int op;
    80         cin >> op;
    81         switch(op) {
    82             case 0: //ins
    83                 cin >> str;
    84                 cout << Trie_ins(str) << endl;
    85                 break;
    86             case 1: //query
    87                 cin >> str;
    88                 cout << Trie_query(str) << endl;
    89                 break;
    90             case 2: //del
    91                 cin >> str;
    92                 cout << Trie_del(str) << endl;
    93                 break;
    94         }
    95     }
    96     return 0;    
    97 }

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    【CFD之道】2018年原创文章汇总
    【OpenFOAM案例】03 Docker安装OpenFOAM
    【OpenFOAM案例】02 自己动手
    【OpenFOAM案例】01 elbow
    Fluent动网格【13】:网格光顺总结及实例
    Fluent动网格【12】:扩散光顺
    Fluent动网格【10】:区域运动案例
    Fluent动网格【11】:弹簧光顺
    happyChat开发系列:使用websocket.io实现双向通信的乐聊大前端开发
    vue,vuex的后台管理项目架子structure-admin,后端服务nodejs
  • 原文地址:https://www.cnblogs.com/jqmtony/p/2910371.html
Copyright © 2011-2022 走看看