zoukankan      html  css  js  c++  java
  • Trie模板

    /*==================================================*\ 
      [Trie] 字典树
      support:
            - insert O(L)
            - query O(L)
            - delete O(L) 
      Trie[i]存储第i个节点的信息:
            next[j]: 下一个字符为j时 对应的节点编号 
            fa: 父亲节点编号
            cnt: 字符出现次数  
    \*==================================================*/
    
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <vector>
    #include <map>
    #include <set>
    #include <string>
    using namespace std;
    //----------------------------------------------
    #define CL(a,num) memset(a,num,sizeof(a));
    #define BtoA(x,y) memcpy(x,y,sizeof(x)); 
    #define eps  1e-12
    #define inf  0x7fffffff
    typedef    __int64    LL;
    //----------------------------------------------
    const int Node_max = 100000 + 5;
    
    struct Node {
        int next[26];
        // including a...z
        int fa, cnt, flag;    
    } Trie[Node_max];
    // root = Trie[0]
    int Trie_size;
    #define t_s Trie_size
    
    int Trie_ins(char str[]) {
        int len = strlen(str);
        int tmp = 0;
        for(int i = 0; i < len; ++i) {
            if(!Trie[tmp].next[str[i] - 'a']) {
                Trie[tmp].next[str[i] - 'a'] = ++t_s;    
                Trie[t_s].fa = tmp;
            }
            tmp = Trie[tmp].next[str[i] - 'a'];
        }
        return ++Trie[tmp].cnt;
        // let the appear_times of str increase then return it
    }
    int Trie_query(char str[]) {
        //return the appear_times of str
        int len = strlen(str);
        int tmp = 0;
        for(int i = 0; i < len; ++i) {
            if(!Trie[tmp].next[str[i] - 'a'])
                return -1;    // if can't find str
            tmp = Trie[tmp].next[str[i] - 'a'];
        }
        return Trie[tmp].cnt;
    }
    int Trie_del(char str[]) {
        int len = strlen(str);
        int tmp = 0;
        for(int i = 0; i < len; ++i) {
            if(!Trie[tmp].next[str[i] - 'a'])
                return -1; // if can't find str
            tmp = Trie[tmp].next[str[i] - 'a'];    
        }
        return --Trie[tmp].cnt; 
        // let the appear_times of str decrease then return it
    }
    int main() {
        char str[20];
        while(true) {
            int op;
            cin >> op;
            switch(op) {
                case 0: //ins
                    cin >> str;
                    cout << Trie_ins(str) << endl;
                    break;
                case 1: //query
                    cin >> str;
                    cout << Trie_query(str) << endl;
                    break;
                case 2: //del
                    cin >> str;
                    cout << Trie_del(str) << endl;
                    break;
            }
        }
        return 0;    
    }
  • 相关阅读:
    LeetCode—-Sort List
    LeetCode——Longest Consecutive Sequence
    LeetCode——single-number系列
    freeswitch源码阅读 之 sofia模块
    freeswitch 内核模块开发
    FreeSwitch B2B 状态转换流程
    freeswitch嵌入python脚本
    freeswitch注册过程分析
    freeswitch对接其它SIP设备
    freeswitch模块之event_socket
  • 原文地址:https://www.cnblogs.com/lolo/p/2910369.html
Copyright © 2011-2022 走看看