一些Trie基础(主要是异或Trie)
查找字符串Trie
直接放模板:
1 | struct trie |
其中,maxn一般是所有字符串的总长度(即最多能拓展出多少节点)
此处设置根节点是0,exist表示:存在至少一个字符串,其等于当前节点所表示的字符串前缀
插入和寻找的复杂度都是字符串长度
AC自动机
即在trie树上进行kmp
直接上模板:
1 | namespace AC |
注意,该code中,num表示等于当前节点表示前缀的字符串数量,在ask中,为避免重复计算,计入后就记为-1,故只能ask一次(或许可采用vis来优化?记录答案后便记vis为1,并将答案压入vector,查询完毕后遍历vector来清空vis)
1 | //vis优化版的query |
0-1trie
支持查询异或和、异或极值、全局加一的操作
直接上模板
1 | namespace trie |
xorv[i]表示以i节点作为根节点的异或和,w[i]表示该节点表示前缀数量,都用maintain维护
全局加1,是利用了+1操作相当于将011111变成100000,即0变1,1变0,1变0时会有进位,对下一位继续addall
merge是将以b为根节点的trie合并到以a为根节点的trie上,注意,由于是合并操作,所以没用maintain