字典树总结

图示

定义 Triei,jTrie_{i,j} 表示第 ii 个点与第 jj 字母相连的边。

性质\color{#FF80FF}\large\textbf{性质}

  1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。

  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

  3. 每个节点的所有子节点包含的字符都不相同。


作用\color{#FF80FF}\large\textbf{作用}

O(n)O(n) 求长度为 nn 字符串前缀。例如某个字符串是否是另一个字符串的前缀,某一个字符串是否出现过。

插入-join\color{#FF80FF}\large\textbf{插入-}{\tt join}

假设有 kk 种字符,则可将看成 kk 叉树。

对插入字符串 ss,当前处在点 pp,在插入 sis_i 时,依次进行以下操作:

  1. 如果 Triep,iTrie_{p,i} 还没有建边,就建边。

  2. 跳到 Triep,iTrie_{p,i} 所在的点,更新 i,pi,p

void join(char *s) {
	int len=strlen(s);
	int p=1;
	for(int i=0;i<len;i++) {
		int m=s[i];
		if(!ch[p][m]) ch[p][m]=++num;
		p=ch[p][m];
	}
}

查找-find\color{#FF80FF}\large\textbf{查找-}{\tt find}

查找字符串 ss 是否为某字符串前缀。

进行插入操作。

  • 不存在建新边,就是前缀。

  • 反之。

int find(char *s) {
	int len=strlen(s);
	int p=1;
	for(int i=0;i<len;i++) {
		int m=s[i];
		if(!ch[p][m]) return false;
		p=ch[p][m];
	}
	return true;
}
posted @ 2023-07-16 21:05  cjrqwq  阅读(2)  评论(0编辑  收藏  举报  来源