标签:字典 kmp ac自动机 回文 插入字符串 新建 void 有一个 string
我们先来看看什么是Trie字典树
可以发现,这棵树的每一条边都有一个字符
有一些点是黄色的,表示它们被标记了
那么,哪些字符串在这棵树中出现过呢?
从树的根节点到每一个被标记的点的路径上的字符串就是对应黄色点所表示的字符串
举个例子,\(5\) 是一个被标记的点
说明这一条从根节点到 \(5\) 的路径 ( \(1\rightarrow2\rightarrow5\) )上的字符串,也就是 ad
,就在这棵树内
新建一个根节点 \(1\)
我们从根节点开始,即 now=1
接着看与 now
点相连的边中有没有字符为 s
的
如果有,跟着这条边走,即 now=s的点编号
如果没有,新建一个点,即 now=++cnt (cnt为点的数量)
最后,标记终点,即 over[now]=true
我们现在要往一个空的Trie字典树里插入 beep
1.now=1
,向下查找,发现没有 b
,插入 b
,now=++cnt=2
2.now=2
,向下查找,发现没有 e
,插入 e
,now=++cnt=3
3.now=3
,向下查找,发现没有 e
,插入 e
,now=++cnt=4
4.now=4
,向下查找,发现没有 p
,插入 p
,now=++cnt=5
5.now=5
,结束,标记 \(5\)
现在,往里面继续插入 bed
6.now=1
,向下查找 ,发现有 b
,跟着走 ,now=2
7.now=2
,向下查找 ,发现有 e
,跟着走 ,now=3
8.now=3
,向下查找 ,发现没有 d
,插入 d
,now=++cnt=6
9.now=6
,结束 ,标记 \(6\)
bool over[maxn];
int cnt=0,trie[maxn][maxm];
void Insert(string str)
{
int now=1;
for(int i=0;i<str.size();i++)
{
int next=str[i]-'a';
if(!trie[now][next])
trie[now][next]=++cnt;
now=trie[now][next];
}
over[now]=true;
}
标签:字典 kmp ac自动机 回文 插入字符串 新建 void 有一个 string
原文地址:https://www.cnblogs.com/666DHG/p/Thematic002.html