题意简述
多组数据。每次给定一个字符串$S$,$|S|<=1e5$,请从$S$中选择两个不相交的回文子串使得这两个子串的长度和最大。
思路框架
对于每个位置,求出前缀和后缀中最长回文子串。然后枚举断点,更新答案。
具体思路
首先考虑如何求出前缀和后缀中的最长回文子串。
然后我们珂以先求最长回文后缀(简称$LPS$,即$Longest Palindrome Suffix$)和最长回文前缀(简称$LPP$,即$Longest Palindrome Prefix$)。$LPS[i]$表示以$i$为结尾的前缀的最长回文后缀,$LPP[i]$表示以$i$开头的后缀的最长回文前缀。然后,只要求$LPS$的前缀最大值,$LPP$的后缀最大值,就是前缀/后缀中的最长回文子串了。
$LPP$和$LPS$都很好求,就是回文自动机的板子。正着跑一遍求出$LPS$,反着跑一遍求出$LPP$。
原地修改前缀/后缀最大值。然后用$LPS[i]+LPP[i+1]$更新答案即珂。这个式子的含义是:一个回文子串在$i$左边,一个回文子串在$i$右边,也就是上文说的“枚举断点”。
提示
代码很长,从Soviet函数开始看代码哦,这样方便理清结构。
代码
1 |
|