专栏文章

题解: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 个月前
查看原文
提供一种数据结构维护的做法。
考虑一次变换是在干什么。手玩样例可以发现,分两种情况:
  1. 如果 SS 的最短前后缀等于 S2\frac{|S|}2,那么每次变换等价与将 SS 变为 SSSS
  2. 如果 SS 的最短前后缀小于 S2\frac{|S|}2,设最短前后缀长度为 dd,那么变换等价于将 SS[d+1,Sd][d+1,|S|-d] 部分复制并添加在 SS 的后面。
第一种情况是简单的,直接去计算即可。
下面讨论第二种情况,手玩样例,考虑其每次变换长度的增加量。记 f0(S)=Sf^0(S)=S。设 di=fi(S)fi1(S)d_i=|f^i(S)|-|f^{i-1}(S)|。对于 i3i\ge 3,有 di=di2+di1d_i=d_{i-2}+d_{i-1}
先用字符串哈希算出 d1d_1d2d_2
用平衡树维护变换。每次操作相当于将字符串其中一段取出,并接在其后面。具体地,我们取出平衡树包含的 O(dep)O(dep) 个区间,然后像替罪羊树那样,将这些区间重构成一棵树。构造新树,直接将原来的树定为新树的左子树,区间重构树定为新树的右子树。
重构树时,需要信息重用。就像主席树那样,将重构树的最下面的区间直接指向原树的对应区间。
平衡树需要记录区间长度,以及当前区间下每种小写字母出现的次数。注意取出平衡树包含的 O(dep)O(dep) 个区间时,区间中点不是 l+r2\frac{l+r}2,而是 l+lthls1l+lth_{ls}-1
最后将 [l,r][l,r] 区间的答案算一下即可。
考虑复杂度。每次取出区间为 O(dep)O(dep) 个,新树深度最多会增加 O(logdep)O(\log dep)。一开始为 O(logS)O(\log |S|) 的深度。深度增加量的增加量较小,所以复杂度为 O(c(logS)2)O(c(\log |S|)^2)cc 表示变换的次数,为 O(log5+12r)O(\log _{\frac{\sqrt 5+1}2} r)。所以总时间复杂度为 O(S+(log5+12r)(logS)2)O(|S|+(\log _{\frac{\sqrt 5+1}2} r) (\log |S|)^2)

评论

0 条评论,欢迎与作者交流。

正在加载评论...