【arc077f】AtCoder Regular Contest 077 F

题意

给你一个形如"SS"的串S,以及一个函数(f(x))(x)是一个形如"SS"的字符串,(f(x))也是一个形如"SS"的字符串。
(x)(f(x))的一个前缀,并且要让(f(x))尽量短。

问在(f^{10^{100}}(S))中,[L,R]中所有字符的出现次数。

[字符集为小写字母,|S|<=100000,1<=L<=R<=1e18 ]

解法

可以发现的是S只用考虑前一半,因为进行了许多次变换,已经后一半不在1e18的范围内。

首先我们第一步应该做的是去观察这个函数的变化规律。

通过最初几步的打表,
我们可以发现,设T是S的border,那么f(S)=ST

S->ST->STS->STSST->....

到这里已经相当明显。
这个变化呈现的是一个类似于斐波那契数列的变换。

所以我们可以模拟这个过程。

由于通过斐波那契的变换只需log(1e18)次就可以超过1e18的长度,
时间复杂度是(O(log^2))的。

border的求法相当简单,
我们给串做一次KMP,然后Brd=n-Fail[n]

原文地址:https://www.cnblogs.com/hiweibolu/p/8480736.html