【JSOI2016】扭动的回文串
问题描述
JYY 有两个长度均为 $N$ 的字符串 $A$ 和 $B$。
一个「扭动字符串」$S(i,j,k)$ 由 $A$ 中的第 $i$ 个字符到第 $j$ 个字符组成的子串与 $B$ 中的第 $j$ 个字符到第 $k$ 个字符组成的子串拼接而成。
比如,若 $A=$’XYZ
’,$B=$’UVW
’,则扭动字符串 $S(1,2,3)=$’XYVW
’。JYY 定义一个「扭动的回文串」为如下情况中的一个:
- $A$ 中的一个回文串;
- $B$ 中的一个回文串;
- 或者某一个回文的扭动字符串$S(i,j,k)$
现在 JYY 希望找出最长的扭动回文串。
输入格式
第一行包含一个正整数 $N$。
第二行包含一个长度为 $N$ 的由大写字母组成的字符串 $A$。
第三行包含一个长度为 $N$ 的由大写字母组成的字符串 $B$。
输出格式
输出的第一行一个整数,表示最长的扭动回文串。
样例输入
5
ABCDE
BAECB
样例输出
5
提示
对于所有的数据,$1≤N≤10^5$
情况1,2直接Manacher就完了。
考虑情况三,先考虑回文串中心在$A$串上的情况,那么画画图容易推导出扭动的位置必然是$A$串的一个极长回文子串的一端,因此可以考虑在$Manacher$过程中,每次算出以当前点为中心的左右边界后,二分枚举通过扭曲能够拓展的长度,然后可以用哈希来判断是否能构成回文串,长度为奇或偶可以通过添加特殊字符处理。
然后如果回文串中心在$B$串上,直接将A,B串交换并且$reverse$之后再跑一遍就行了。
代码:
1 |
|