字典树(Trie)
Trie 是一种能够快速插入和查询字符串的多叉树结构。
节点的编号各不相同,根节点编号为 \(0\) ,其他节点用来标识路径。
还可以标记单词插入的次数。边表示字符。
一般情况下,Trie维护字符串的集合,支持以下两种操作:
1.向集合中插入一个字符串。
2.向集合中查询一个字符串。
建字典树
子数组 ch[p][j]
表示从节点 \(p\) 沿着 \(j\) 这条边走的到子节点。
计数数组 cnt[p]
表示以节点 \(p\) 结尾得到单词的插入次数。
节点编号 idx
用来给节点编号。
1.Trie中只有一个根节点,编号为0。
2.从根开始插入,枚举字符串的所有字符。
如果有儿子,那么直接走到儿子。
反之,先创建儿子,再走到儿子。
3.维护计数数组。
int ch[N][26],cnt[N],idx;
void insert(string s){int p=0;for(auto c:s){int j=c-'a';if(!ch[p][j]) ch[p][j]=++idx;p=ch[p][j];}cnt[p]++;
}
int query(string s){int p=0;for(auto c:s){int j=c-'a';if(!ch[p][j]) return 0;p=ch[p][j];}return cnt[p];
}