字典树 作者:CJW 更新于 2026-10-12 Trie字符串前缀

Trie 字典树

字符串前缀树模板,支持插入与查询前缀出现次数


代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;                    // 总字符数上界
int ch[N][26], cnt[N], tot = 1;           // 根为 1

void insert(const string &s) {
    int u = 1;
    for (char c : s) {
        int x = c - 'a';
        if (!ch[u][x]) ch[u][x] = ++tot;
        u = ch[u][x], ++cnt[u];           // cnt: 经过该点的串数
    }
}
int ask(const string &s) {                // 以 s 为前缀的串数,0 表示不存在
    int u = 1;
    for (char c : s) {
        int x = c - 'a';
        if (!ch[u][x]) return 0;
        u = ch[u][x];
    }
    return cnt[u];
}

signed main() {
    insert("apple"), insert("app"), insert("apply");
    cout << ask("app") << ' ' << ask("apq") << '\n';   // 3 0
    return 0;
}

说明

  • 空间 O(总字符数 × 26),串多且长时注意内存,可换成 map 或边表存转移。
  • 再开一个 end[] 在插入结束时打标记,即可判断「某串是否恰好插入过」。
  • 01-Trie 取 SIGMA = 2 逐位插入,可解决最大异或对。

典型应用

  • 洛谷 P8306【模板】字典树;
  • 洛谷 P4551 最长异或路径(01-Trie + 树上异或前缀);
  • 字符串自动补全、前缀匹配统计。