[JSOI2016]无界单词[动态规划、kmp]
题意
分析
-
对于第一问,枚举最终串最小的相同前后缀来统计答案。
-
由于最小的相同前后缀也是无界单词,所以可以考虑先求解子问题。
-
定义状态 \(f(i)\) 表示长度为 \(i\) 的串中有多少个是无界单词。
-
补集转化后容易得到:
\[f_i=2^i-\sum\limits_{i=1}^{\left\lfloor\frac{i}{2}\right\rfloor}f_j\times2^{i-2j} \] -
对于第二问,按位确定答案。每次在前 \(len\) 位确定的情况下重新算 \(f\) 。
- 如果 \(i\le len\) :此时求出 \(next\) 数组判断。
- 否则,如果 \(j>len\) : 正常判断。
- 如果 \(j \le len\) 且 \(len\le n - j\) : 贡献为 \(f_j\times 2^{i-len-j}\)
- 如果 \(j\le len\) 且 \(len > n - j\):要满足 \(s[1\cdots len-i+j]=s[i-j+1\cdots len]\) 且 \(f_j\) 为1。