模板

字典树Trie,还是数组的好,草。

const int MAXN = 500000;

struct TrieNode {
    TrieNode *ch[26];
};

struct Trie {
    TrieNode tn[MAXN + 5], *root;
    int top;

    inline void Init() {
        top = 0;
        root = NewNode();
    }
    inline TrieNode *NewNode() {
        for(int i = 0; i < 10; ++i)
            tn[top].ch[i] = nullptr;
        return &tn[top++];
    }
    inline TrieNode *Insert(char *s) {
        TrieNode *cur = root;
        for(char *i = s; *i != ''; ++i) {
            TrieNode *(&next)=cur->ch[*i - 'a'];
            if(!next)
                next = NewNode();
            cur = next;
        }
        return cur;
    }
    inline TrieNode *Query(char *s) {
        TrieNode *cur = root;
        for(char *i = s; *i != ''; ++i) {
            TrieNode *(&next)=cur->ch[*i - 'a'];
            if(!next)
                return nullptr;
            cur = next;
        }
        return cur;
    }
} trie;
const int MAXN = 5000000;

struct TrieNode {
    int ch[26];
};

struct Trie {
    TrieNode tn[MAXN + 5], root=0;
    int top;

    inline void Init() {
        top = 0;
        root = NewNode();
    }
    inline int NewNode() {
        memset(tn[top].ch,0,sizeof(tn[top].ch));
        return top++;
    }
    inline int Insert(char *s) {
        int cur = root;
        for(char *i = s; *i != ''; ++i) {
            int t=*i - 'a';
            if(!tn[cur].ch[t])
                tn[cur].ch[t] = NewNode();
            cur = tn[cur].ch[t];
        }
        return cur;
    }
    inline bool Query(char *s) {
        int cur = root;
        for(char *i = s; *i != ''; ++i) {
            int t=*i - 'a';
            if(!tn[cur].ch[t])
                return false;
            cur = tn[cur].ch[t];
        }
        return true;
    }
} trie;
原文地址:https://www.cnblogs.com/Yinku/p/11247784.html