求公共子树(后缀树法)
内容来自
晁晓菲,杨晓龙,李书琴,唐晶磊.两棵树的公共子树查找算法综述[J].陕西理工学院学报(自然科学版),2009,25(02):33-39.
求公共子树
后缀树法-Grossi
后缀树
BANANA的后缀
- 其中叶子节点的数字代表该后缀的在原字符串中的起始坐标
基本步骤
- 将树结构转化为编码,将两个编码拼接,根据拼接编码构造后缀树
- 查找公共后缀,找到公共子树
1 构造后缀树
1.1 前序遍历树T和R等到code(T)和code(R)
编码方式:前序遍历各结点,每回溯一层添加一个标记 #
code(T)=abc#c##cca##a#cb#a###ba#b###
code(R)=bcca##a#cb#a###ba#cb#a####
1.2 拼接code(T)和code(R)得到C
C=code(T) $ code(R) $
=abc#c##cca##a#cb#a###ba#b### $ bcca##a#cb#a###ba#cb#a#### $
1.3 根据C构造后缀树S
- 根据后缀起始字符的位置将叶子结点标色
T->青绿色, R->红色
2 查找公共前缀
2.1 后续遍历S,标记红色叶子节点的父结点,如图二(c)中的结点z、v、u
2. 2 构造函数w(z),其中z为S的一个内部结点。
w(z)表示从根结点到z的路径上所有弧上标记的串联,
是所有从z向下所有叶子结点的最长公共前缀。
如图二(c)中w(z)=cb#是叶子结点2,15,38,48所对应的后缀的最长公共前缀
2.3 对青绿色叶子结点l计算deep(l)
设u为从根结点到l的具有最大深度的(在2.1中)标记的结点
若u存在,则deep(l)=|w(u)|否则deep(l)=0
如图二(d)
2.4 判断
如果S的叶子结点l对应的子树B满足len(l)<=deep(l)那么,B是T和R的公共子树
len(l)=|code(B)|
- l==15
code(B)=cb#a###
w(u)=ab#a###ba#
len(l)=6 <= deep(l)=|w(u)|=10
B是T和R的公共子树 - l==2
code(B)=cb#c###
w(z)=cb#
len(l)=6 > deep(l)=|w(z)|=3
B不是是T和R的公共子树
复杂度
时间和空间复杂度都为O(n)
求公共子树(后缀树法)相关推荐
- HDU - 5008 Boring String Problem(后缀树求本质不同第k大子串)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,再给出 mmm 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置.如果有多个答案,输出起点最小的那个.强制在线. 题目分析 ...
- 【dfs序+树状数组】多次更新+求结点子树和操作,牛客小白月赛24 I题 求和
前置知识点 dfs遍历 树状数组/线段树知识 链接 I题 求和. 题意 已知有 n 个节点,有 n−1 条边,形成一个树的结构. 给定一个根节点 k,每个节点都有一个权值,节点i的权值为 vi 给 m ...
- Kmp算法之 求最大公共前后缀
先抛问题1:如果我们已知一个字符str的最大公共前后缀长度,当这个str再添加一个字符的str2,如何判断这个新的str2的最大公共前后缀长度?? 结论:只要将新添加的字符,与str的最大公共前后缀中 ...
- 【转】从Trie树(字典树)谈到后缀树
本文第一部分,咱们就来了解这个Trie树,然后自然而然过渡到第二部分.后缀树,接着进入第三部分.详细阐述后缀树的构造方法-Ukkonen. 第一部分.Trie树 1.1.什么是Trie树 Trie树, ...
- bzoj1921 [CTSC2010]珠宝商 SAM+后缀树+点分治
Description 有一棵n个节点的树和一个长度为m的字符串S,树上每个节点有一个字符.问对于任意的有序数对(x,y),从x到y路径组成的字符串在S中出现次数的和. n,m≤5⋅104n,m\le ...
- 字符串-后缀树和后缀数组详解
文章目录 后缀树 后缀数组 概念 sa[] rk[] height[] 例题 HDU-1403最长公共子串 洛谷P2408 不同子串个数 HDU-5769Substring 后缀树 建议先了解一下字典 ...
- 从Trie树(字典树)和后缀树
从Trie树(字典树)谈到后缀树 转载:http://blog.csdn.net/v_july_v/article/details/6897097#t22 感谢作者,侵删. 引言 常关注本blog的读 ...
- 字典树(trie树)、后缀树
(1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...
- 【洛谷5284】[十二省联考2019] 字符串问题(后缀树优化建边)
题目: 洛谷 5284 分析: 首先不要问我标题里的「后缀树」是什么,我也不会,瞎写的 -- (传说就是反串后缀自动机的 fa 树?) 前置技能:[知识总结]后缀自动机的构建 首先有一个很 naive ...
最新文章
- Mysql修改设置root密码的命令及方法
- ValueError: output array is read-only
- Python 中异常嵌套
- mysql查看防火墙状态命令_Linux设置允许指定端口通过防火墙centos7
- python中常见的一些题目汇总
- 基于python的HOG+SVM目标检测算法实现
- oracle =1,oracle中的 where 1=1 和where 1 !=1
- html5 indexeddb 排序,html5 – 在IndexedDB中,有没有办法进行排序复合查询?
- CSS3 Media Query实现响应式Web设计(针对不同移动设备宽度)
- Oracle使用sqlplus登录用户尽量使用nolog登录
- iOS开发之iOS11、iPhone X、Xcode9 适配指南
- Vue源码:mustache模板引擎学习
- ARKit 和 ARCore剖析、结构、原理介绍
- 英特尔核显驱动hd630_hd630相当于什么显卡
- 最新版苹果公司开发者账户申请
- 微信公众号开发 - token获取(保证同一时间段内只请求一次)
- css Hack
- python第一弹 爬虫淘女郎图片
- 金山毒霸:猫癣病毒“服务器”现身广东
- 全球及中国自助打印亭行业形势发展及十四五战略规划建议报告2021-2027年版
热门文章
- java新手代码翻译成中文_急!老师让我把以下代码翻译成中文的
- 如何利用excel中的数据源制作数据地图
- 阿铭Linux_网站维护学习笔记20190305
- 2022.7.11-7.17 AI行业周刊(第106期):竭尽全力,努力就好
- 精选机器学习深度学习视频资源合集 !(附下载链接)
- c语言控制手机,怎么写用电脑控制手机的代码
- java中ftl什么文件_.ftl文件 是什么文件 freemarker
- highcharts使用downloadCSV导出数据时间与实际时间不对应
- shufflenet_v1
- 捷联惯导系统学习2.3(方向余弦阵微分方程)