P10272 在四方城外 题解
String Round Rank 6 纪念,场切了此题,写篇题解。
题目涉及了 Border,显然可以跟 KMP 结合,此外就是一些分类讨论了。
性质
- 长为
n 的字符串S 为周期字符串等价于:存在长为k 的字符串T ,满足:k|n ,S 与\frac nk 个T 拼接而成的字符串等价。k 被称为S 的一个周期。 - 满足条件一的最小的
k 被称为字符串S 的最小周期。 - 若长为
n 的字符串S 为周期字符串,记其最长真 border 的长为m ,若S 存在周期n-m ,则n-m 为S 的最小周期。
这些性质的证明可以见有关 KMP 的文章。
分类讨论
我们使用 KMP 求出
1:T 为空
显然每次根本无法拓展,答案即为
2:|T| 为 S 的一个周期
假设已用 KMP 求出最长真 border
由于拓展的字符串需要是真 border,每次拓展的长度即为
3:T 不是周期字符串
注意:此情况的前提是不满足前两个情况。
显然每次拓展的长度均为
4:T 是周期字符串
注意:此情况的前提是不满足前两个情况。
此情况的讨论应该是最容易漏掉的一种,
设
例如:abababcabab,则 abab,ab 在
这时的拓展情况应该是怎样的呢?不难发现每次向后拓展
将
- 在
a\geqslant b 时,每次拓展b 个S[1:p] ,同时b\leftarrow 2b ,这样的拓展不超过\log_2n 次,可以暴力枚举。 - 在
a<b 时,每次拓展a 个S[1:p] ,由于a 这个数值不会变,所以容易计算出。
具体地,计算第一部分暴力维护长度
容易发现第三种情况和这种情况类似,可以令