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;    
    }
  • 相关阅读:
    StatusStrip控件中元素右对齐方法两则
    在EF4.0中获取ObjectContext的数据库连接字符串
    通过反射调用泛型参数方法
    阻止保存要求重新创建表的更改
    [转]表达式解析的全部源码
    让ADO.NET SelfTracking Entity Generator产生的实体类支持RejectChanges()方法
    关于XtraGrid的CustomUnboundColumnData事件的触发条件
    WCF远程服务器强制关闭了一个连接
    让Sandcastle Help File Builder支持VS2010
    ==Entity Framework DBContext 增删改查深度解析
  • 原文地址:https://www.cnblogs.com/lolo/p/2910369.html
Copyright © 2011-2022 走看看