P7114 [NOIP2020] 字符串匹配
\(F(S)\) 表示 \(S\) 中出现奇数次的字符数量,\(F(l,r) = F(S[l\dots r])\)。
求将 \(S\) 划分成 \((AB)^iC\) 的方案数,其中 \(A,B,C\) 不为空,\(i \ge 1\),且 \(F(A) \le F(C)\)。
枚举 \(p\) 表示 \(AB\) 的长度,显然 \(AB\) 是 \(s\) 的长度为 \(p\) 的前缀。通过一些字符串魔法,可以求出长度为 \(p\) 的前缀最多循环了几遍。设这个循环次数为 \(k\)。
最简单的魔法是扩展 KMP。\(k = \left \lfloor \dfrac{z_{p+1}}p \right \rfloor+1\)。
例如 \(s = \texttt{abcabcabcabcbbb}\)。那么 \(p=3\) 时 \(k=4\)(即 \(\texttt{abc|abc|abc|abc|bbb}\)),\(p=6\) 时 \(k=2\)(即 \(\texttt{abcabc|abcabc|bbb}\))
确定 \(AB\) 的长度后,还需要确定 \(AB\) 循环的次数 \(i\)(显然 \(i \le k\))。如果 \(i\) 能确定,那么 \(F(C) = F(ip+1,n)\),我们可以预处理。
分类讨论:
- \(k-i\) 是偶数:即前缀 \(p\) 在 \([ip+1, kp]\) 中循环出现了偶数次。一个字符串循环出现偶数次后,每个字符的出现次数一定也都是偶数。即 \(F(ip+1,n)=F(kp+1,n)\)。那么 \(F(A) \le F(C)\) 变成了 \(F(1,|A|) \le F(kp+1,n)\),其中 \(|A| < p\)。此时 \(k,p,n\) 都是定值,\(F(1,\dots)\) 和 \(F(\dots,n)\) 都可以预处理,那么变成了一个二维数点的问题。
- \(k-i\) 是奇数:那么 \(k-i-1\) 是偶数。与上面类似地,\(F(ip+1,n) = F((k-1)p+1,n)\)。仍然是二维数点。

浙公网安备 33010602011771号