字典树 Trie
Trie 是一棵有根树,用边代表字母,从代表空串的根节点到一个结点路径上的字母构成了一个字符串。而从根节点到标有数字的点是保存的字符串 A 、to、 tea、 ted、 ten、 i、 in、 inn 。
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;
一切伟大的行动和思想,都有一个微不足道的开始。

浙公网安备 33010602011771号