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)\)。仍然是二维数点。
posted @ 2025-07-01 10:24  2huk  阅读(17)  评论(0)    收藏  举报
2048 Game
Score
0
Best
0