后缀平衡树
定义
后缀之间的大小由字典序定义,后缀平衡树就是一个维护这些后缀顺序的平衡树,即字符串
特别地,后缀平衡树的中序遍历即为后缀数组。
构造过程
对长度为
记后缀平衡树维护的集合为
这里使用期望树高为
做法 1
插入时,暴力比较两个后缀之间的大小关系,从而判断之后是往哪一个子树添加。这样子,单次插入至多比较
一共会插入
做法 2
注意到
假设当前要比较
一共会插入
做法 3
根据做法 2,如果能够
记
不妨令平衡树中每个节点对应一个实数区间,令根节点对应
由于使用了期望树高为
做法 4
其实可以先构建出后缀数组,然后再根据后缀数组构建后缀平衡树。这样做的复杂度瓶颈在于后缀数组的构建复杂度或者所用平衡树一次性插入
删除操作
假设当前添加的后缀为
类似于插入操作,借助平衡树的删除节点操作可以完成删除
后缀平衡树的优点
- 后缀平衡树的思路比较清晰,相比后缀自动机等后缀结构更好理解,会写平衡树就能写。
- 后缀平衡树的复杂度不依赖于字符集的大小
- 后缀平衡树支持在字符串开头删除一个字符
- 如果使用支持可持久化的平衡树,那么后缀平衡树也能可持久化
例题
P3809【模板】后缀排序
后缀数组的模板题,建出后缀平衡树之后,通过中序遍历得到后缀数组。
SGT 版本的参考代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
|
P6164【模板】后缀平衡树
题意
给定初始字符串
- 在当前字符串的后面插入若干个字符。
- 在当前字符串的后面删除若干个字符。
- 询问字符串
作为连续子串在当前字符串中出现了几次?
题目 强制在线,字符串变化长度以及初始长度
对于操作 1 和操作 2,由于后缀平衡树维护头插和头删操作比较方便,所以想到把尾插和尾删操作搞成头插和头删。这里如果维护
对于操作 3,
现在要查询某一个串
SGT 版本的参考代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
|
参考资料
- 陈立杰 -《重量平衡树和后缀平衡树在信息学奥赛中的应用》
本页面最近更新:2023/2/18 07:57:07,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:Backl1ght, billchenchina, Enter-tainer, Ir1d, kenlig, ouuan
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用