【arc077f】AtCoder Regular Contest 077 F - SS
题意
给你一个形如"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]