Codeforces 1326D2 - Prefix-Suffix Palindrome (Hard version)
Posted stelayuri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1326D2 - Prefix-Suffix Palindrome (Hard version)相关的知识,希望对你有一定的参考价值。
题目大意
T组数据,每组给定一个字符串 s
求一个最长的字符串 t ,满足:
- t 是一个回文串
- t = a+b ,a是字符串s的前缀,b是字符串s的后缀,‘+‘ 为拼接两字符串,ab可能为空串
数据范围
数据组数不超过 1e5
字符串的总共长度不超过 1e6
解题思路
(标准做法应该是哈希)
因为对于任意的字符串T,设R(T)为T的倒置
则 T+回文串+R(T) 仍然是一个回文串
可以直接双指针在s里找出最长的 T和R(T)
while(L<R&&s[L]==s[R])
L++,R--;
(上面这步O(n)不能省略)
但是因为数据范围内的字符数量很大,所以不能继续采用Easy版的O(n^2)暴力法
很容易想到,对于中间剩下的子串,要想求出与两边相邻的最长回文串
就可以采用Manacher算法来 O(n) 处理加计算
在初始化函数里传入两个变量 l 和 r ,表示只要处理 [ l , r ) 区间内的字符即可
void initStr(int l,int r){
int k=0;
str[k++]='@';
for(int i=l;i<=r;i++){
str[k++]='#';
str[k++]=s[i];
}
str[k++]='#';
len=k;
str[k]='