【JSOI2016】扭动的回文串
输入格式
第一行包含一个正整数 N。
第二行包含一个长度为 N 的由大写字母组成的字符串 A。
第三行包含一个长度为 N 的由大写字母组成的字符串 B。
输出格式
输出的第一行一个整数,表示最长的扭动回文串。
样例输入 1
5
ABCDE
BAECB
样例输出 1
5
样例输入 2
30
AABABAAAAABBBAAAAAABBAABAABABA
AAAAAAABABBAAAAAABABAAAABAAAAB
样例输出 2
23
提示
样例1解释
最佳方案中的扭动回文串如下所示(不在回文串中的字符用 .
表示):
1 | .BC.. |
对于所有的数据,1≤N≤10^5
情况1,2就是裸的Manacher,跑完之后分别得到两个字符串的rad数组备用。
考虑情况3,怎样的扭动回文串会最长?观察发现,如果在插入特殊字符后枚举扭动回文串的中心,那么它一定会在当前串里左右延伸到最长才进入另一个串。
至于这个结论的证明,假设没有扩展完而达到了最长扭动回文串,画图可知扩展完之后在进入不会更劣。
于是枚举中心,对左右伸展的长度二分答案,Hash验证即可。
Manacher算法插入特殊字符的预处理使得在新串中,长度为偶数的串不可能是回文串,原来的回文串变成了新的长度为奇数的回文串,不会产生新的回文串,保证了算法的正确性。
1 |
|