内容来自

晁晓菲,杨晓龙,李书琴,唐晶磊.两棵树的公共子树查找算法综述[J].陕西理工学院学报(自然科学版),2009,25(02):33-39.

求公共子树

后缀树法-Grossi

后缀树

BANANA的后缀

  • 其中叶子节点的数字代表该后缀的在原字符串中的起始坐标

基本步骤

  1. 将树结构转化为编码,将两个编码拼接,根据拼接编码构造后缀树
  2. 查找公共后缀,找到公共子树

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)

求公共子树(后缀树法)相关推荐

  1. HDU - 5008 Boring String Problem(后缀树求本质不同第k大子串)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,再给出 mmm 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置.如果有多个答案,输出起点最小的那个.强制在线. 题目分析 ...

  2. 【dfs序+树状数组】多次更新+求结点子树和操作,牛客小白月赛24 I题 求和

    前置知识点 dfs遍历 树状数组/线段树知识 链接 I题 求和. 题意 已知有 n 个节点,有 n−1 条边,形成一个树的结构. 给定一个根节点 k,每个节点都有一个权值,节点i的权值为 vi 给 m ...

  3. Kmp算法之 求最大公共前后缀

    先抛问题1:如果我们已知一个字符str的最大公共前后缀长度,当这个str再添加一个字符的str2,如何判断这个新的str2的最大公共前后缀长度?? 结论:只要将新添加的字符,与str的最大公共前后缀中 ...

  4. 【转】从Trie树(字典树)谈到后缀树

    本文第一部分,咱们就来了解这个Trie树,然后自然而然过渡到第二部分.后缀树,接着进入第三部分.详细阐述后缀树的构造方法-Ukkonen. 第一部分.Trie树 1.1.什么是Trie树 Trie树, ...

  5. bzoj1921 [CTSC2010]珠宝商 SAM+后缀树+点分治

    Description 有一棵n个节点的树和一个长度为m的字符串S,树上每个节点有一个字符.问对于任意的有序数对(x,y),从x到y路径组成的字符串在S中出现次数的和. n,m≤5⋅104n,m\le ...

  6. 字符串-后缀树和后缀数组详解

    文章目录 后缀树 后缀数组 概念 sa[] rk[] height[] 例题 HDU-1403最长公共子串 洛谷P2408 不同子串个数 HDU-5769Substring 后缀树 建议先了解一下字典 ...

  7. 从Trie树(字典树)和后缀树

    从Trie树(字典树)谈到后缀树 转载:http://blog.csdn.net/v_july_v/article/details/6897097#t22 感谢作者,侵删. 引言 常关注本blog的读 ...

  8. 字典树(trie树)、后缀树

    (1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...

  9. 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串

    1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...

  10. 【洛谷5284】[十二省联考2019] 字符串问题(后缀树优化建边)

    题目: 洛谷 5284 分析: 首先不要问我标题里的「后缀树」是什么,我也不会,瞎写的 -- (传说就是反串后缀自动机的 fa 树?) 前置技能:[知识总结]后缀自动机的构建 首先有一个很 naive ...

最新文章

  1. Mysql修改设置root密码的命令及方法
  2. ValueError: output array is read-only
  3. Python 中异常嵌套
  4. mysql查看防火墙状态命令_Linux设置允许指定端口通过防火墙centos7
  5. python中常见的一些题目汇总
  6. 基于python的HOG+SVM目标检测算法实现
  7. oracle =1,oracle中的 where 1=1 和where 1 !=1
  8. html5 indexeddb 排序,html5 – 在IndexedDB中,有没有办法进行排序复合查询?
  9. CSS3 Media Query实现响应式Web设计(针对不同移动设备宽度)
  10. Oracle使用sqlplus登录用户尽量使用nolog登录
  11. iOS开发之iOS11、iPhone X、Xcode9 适配指南
  12. Vue源码:mustache模板引擎学习
  13. ARKit 和 ARCore剖析、结构、原理介绍
  14. 英特尔核显驱动hd630_hd630相当于什么显卡
  15. 最新版苹果公司开发者账户申请
  16. 微信公众号开发 - token获取(保证同一时间段内只请求一次)
  17. css Hack
  18. python第一弹 爬虫淘女郎图片
  19. 金山毒霸:猫癣病毒“服务器”现身广东
  20. 全球及中国自助打印亭行业形势发展及十四五战略规划建议报告2021-2027年版

热门文章

  1. java新手代码翻译成中文_急!老师让我把以下代码翻译成中文的
  2. 如何利用excel中的数据源制作数据地图
  3. 阿铭Linux_网站维护学习笔记20190305
  4. 2022.7.11-7.17 AI行业周刊(第106期):竭尽全力,努力就好
  5. 精选机器学习深度学习视频资源合集 !(附下载链接)
  6. c语言控制手机,怎么写用电脑控制手机的代码
  7. java中ftl什么文件_.ftl文件 是什么文件 freemarker
  8. highcharts使用downloadCSV导出数据时间与实际时间不对应
  9. shufflenet_v1
  10. 捷联惯导系统学习2.3(方向余弦阵微分方程)