Trie

Trie(前缀树)用来保存字符串集合
这个树的根结点编号为0,其余结点编号为1开始的正整数
ch[i][j]表示结点i的边为j的子结点的编号(不存在则为0),当字符集为全体小写字母时,j的范围sigma_max=26
struct Trie {
    int ch[maxnode][sigma_size];
    int val[maxnode];
    int sz;
    Trie() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); }
    int idx(char c) { return c - 'a'; }
    
    void insert(char *s, int v) {
        int u = 0, n = strlen(s);
        for(int i = 0; i < n; i++) {
            int c = idx(s[i]);
            if(!ch[u][c]) {
                memset(ch[sz], 0, sizeof(ch[sz]));
                val[sz] = 0;
                ch[u][c] = sz++;
            }
            u = ch[u][c];
        }
        val[u] = v;
    }
    
    bool query(char *s) {
        int u = 0, n = strlen(s);
        for(int i = 0; i < n; i++) {
            int c = idx(s[i]);
            if(!ch[u][c]) return false;
            u = ch[u][c];
        }
        return val[u];
    }
};

 

posted @ 2019-07-01 21:19  Hanasaki  阅读(217)  评论(0)    收藏  举报