专栏文章
题解:AT_arc077_d [ARC077F] SS
AT_arc077_d题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minljpk2
- 此快照首次捕获于
- 2025/12/02 04:23 3 个月前
- 此快照最后确认于
- 2025/12/02 04:23 3 个月前
提供一种数据结构维护的做法。
考虑一次变换是在干什么。手玩样例可以发现,分两种情况:
- 如果 的最短前后缀等于 ,那么每次变换等价与将 变为 。
- 如果 的最短前后缀小于 ,设最短前后缀长度为 ,那么变换等价于将 的 部分复制并添加在 的后面。
第一种情况是简单的,直接去计算即可。
下面讨论第二种情况,手玩样例,考虑其每次变换长度的增加量。记 。设 。对于 ,有 。
先用字符串哈希算出 和 。
用平衡树维护变换。每次操作相当于将字符串其中一段取出,并接在其后面。具体地,我们取出平衡树包含的 个区间,然后像替罪羊树那样,将这些区间重构成一棵树。构造新树,直接将原来的树定为新树的左子树,区间重构树定为新树的右子树。
重构树时,需要信息重用。就像主席树那样,将重构树的最下面的区间直接指向原树的对应区间。
平衡树需要记录区间长度,以及当前区间下每种小写字母出现的次数。注意取出平衡树包含的 个区间时,区间中点不是 ,而是 。
最后将 区间的答案算一下即可。
考虑复杂度。每次取出区间为 个,新树深度最多会增加 。一开始为 的深度。深度增加量的增加量较小,所以复杂度为 。 表示变换的次数,为 。所以总时间复杂度为 。
代码。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...