「LG P1393」Mivik 的标题
题目链接:洛谷。
设 \(L=|S|\),设 \(s\) 为所谓名字的字符串。
前半部分算是非常套路。设 \(f_k\) 表示随机生成一个长度为 \(k\) 的字符串后,它的一个后缀为 \(s\),且 \(s\) 为第一次出现的概率。
不难发现答案就是 \(\sum_{k=1}^{n}f_k\)。这个状态的转移也是套路的容斥,也就是去容斥“第一次出现”。我们首先要保证没有 \(s\) 的结尾位置落在 \([1,k-L]\) 之间,那么此时任意组合的概率就是 \((1-\sum_{j=1}^{k-L}f_j)\times m^{-L}\)。
接着对于结尾在 \((k-L,k)\) 的 \(s\) 进行容斥,对于每一种不合法的情况,我们在第一次重复出现 \(s\) 的位置那里容斥掉它。前面已经保证了在 \(k-L\) 之前不会有 \(s\) 结尾,因此之前的贡献可以用 \(f\) 计算。假设相交的长度为 \(l\),则贡献应当为 \(-f_{k-L+l}\times m^{-L+l}\),并且还需要满足 \(s[1:l]\) 是 \(s\) 的一个 Border。
现在其实已经可以将问题写成多项式形式并使用半在线卷积计算答案了。不过,我们可以将 Border 划分为 \(O(\log L)\) 个等差数列,这样每个等差数列中的 \(-f_{k-L+l}\times m^{-L+l}\) 可以直接前缀和维护,最终只需要维护 \(O(\log L)\) 组前缀和即可优化转移。
小结:
- 注意这类问题的通用 DP 形式;
- 注意使用等差性质优化转移的思想;