字典树 Trie


Trie 是一棵有根树,用边代表字母,从代表空串的根节点到一个结点路径上的字母构成了一个字符串。而从根节点到标有数字的点是保存的字符串 Atoteatedteniininn

Trie 是一个 确定有限状态自动机,是 AC 自动机的一部分。它的实现分成插入一个字符串,查找一个字符串,删除一个字符串三部分。

  • v i s x vis_x visx x x x 是否在 Trie 中。
  • n x t x , c nxt_{x,c} nxtx,c 为从 x x x 代表字母 c c c 的出边连向的结点。

可以发现 Trie 的实现比较简单,且时空复杂度为线性

struct trie {
    int nxt[100000][26], cnt; 
    bool vis[100000];
    void insert(string s) {
        int p = 0;
        for (int i = 0; i < s.size(); i++) {
            int c = s[i] - 'a';
            if (!nxt[p][c]) nxt[p][c] = ++cnt;
            p = nxt[p][c];
        }
        vis[p] = 1;
    }
    bool find(string s) {
        int p = 0;
        for (int i = 0; i < s.size(); i++) {
            int c = s[i] - 'a';
            if (!nxt[p][c]) return 0;
            p = nxt[p][c];
        }
        return vis[p];
    }
    void del(string s) {
        int p = 0;
        for (int i = 0; i < s.size(); i++) {
            int c = s[i] - 'a';
            if (!nxt[p][c]) return ;
            p = nxt[p][c];
        }
        vis[p] = 0;
    }
} T;
posted @ 2020-02-21 14:35  ylxmf2005  阅读(33)  评论(0)    收藏  举报