十重回文划分法:最多/最少(非平凡)回文/非回文 子序列/子串 划分

只考虑常数字符集,所以关于字符集的复杂度都没算进来。

最少非回文子串划分

答案是 \(1\)\(2\) 或者无解,参考 CF1951E 的题解。

时间复杂度:\(\mathcal O(n)\)

最少非回文子序列划分

考虑最少非回文子串划分的情况,可以发现答案是 \(2\) 的情况也不可能划分成 \(1\) 个子序列,所以和上面是一样的。

时间复杂度:\(\mathcal O(n)\)

最少回文子串划分

容易有一个 \(\mathcal O(n^2)\) dp,这个 dp 可以用 PAM slink 优化做到 \(\mathcal O(n\log n)\)。参考做法是 CF932G,这个题是数偶回文划分的方案数(当然要先用一步倒着间隔插的 trick 把 border 划分转回文划分),可以直接改成数回文划分的 \(\min\)

网上介绍这个的资料很多。

时间复杂度:\(\mathcal O(n\log n)\)

最少回文子序列划分

目前的一些进展:

  • 一个字符串的最长回文子序列的长度是它和反串的 LCS 长度(存疑,但是没有找到反例)。
  • 每次找出最长回文子序列删去继续找,可以得到最小划分(存疑,倾向于不正确)。
  • 显然不能区间 dp。
  • 答案显然不超过字符集大小。

这个真的有小于指数级的做法吗……

尝试了网络流,也无法解决。

事实上 clj 在 2013 年的 HDU 多校出了这题 HDU4628 Pieces,复杂度只做到了直接子集 dp 的 \(\mathcal O(3^n)\)

最多非回文子串划分

贪着做,两个字符不相同就在后一个字符后面划一下,这样最后可能会剩下一段,前面的都形如 \(\texttt{aaaaa}\cdots\texttt{b}\)。显然这样做是上界,因为一个非回文子串至少需要两个不同的字符。

这样的问题是最后一段不一定能合进去还保证最后一个串非回文。你考虑倒着再做一遍。如果还不行的话就要考虑调整方案了。

此时可以发现,最后三个划分合并在一起一定要么不是回文串,要么不可能是一个除中间外都相同的 \(\texttt{aaabaaa}\) 式的回文串,按照最少非回文串划分的结论,这种一定回文串一定可以切分成两个非回文串,所以答案就减掉一。

大概需要特判一下初始划分数 \(\le 2\) 的情况。

时间复杂度:\(\mathcal O(n)\)

最多非回文子序列划分

P11190「KDOI-10」反回文串

时间复杂度:\(\mathcal O(n)\)

最多回文子串划分

奶龙题,输出 \(n\)

时间复杂度:\(\mathcal O(1)\)

最多非平凡回文子串划分

不允许串全为同一个字符。

还没想。

最多回文子序列划分

奶龙题,输出 \(n\)

时间复杂度:\(\mathcal O(1)\)

最多非平凡回文子序列划分

不允许串全为同一个字符。

还没想。

posted @ 2024-10-22 18:07  Shunpower  阅读(30)  评论(0编辑  收藏  举报