十重回文划分法:最多/最少(非平凡)回文/非回文 子序列/子串 划分
只考虑常数字符集,所以关于字符集的复杂度都没算进来。
最少非回文子串划分
答案是 \(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)\)。
最多非回文子序列划分
时间复杂度:\(\mathcal O(n)\)。
最多回文子串划分
奶龙题,输出 \(n\)。
时间复杂度:\(\mathcal O(1)\)。
最多非平凡回文子串划分
不允许串全为同一个字符。
还没想。
最多回文子序列划分
奶龙题,输出 \(n\)。
时间复杂度:\(\mathcal O(1)\)。
最多非平凡回文子序列划分
不允许串全为同一个字符。
还没想。