manacher


#include 
using namespace std;
const int N = 2e7;
char s[N << 1], ss[N];
int n, ans, p[N << 1];
void manacher(){
	//预处理字符串 
	s[0] = '-', s[1] = '#';
	for (int i = 0; i < n; ++ i){
		s[2 * i + 2] = ss[i];
		s[2 * i + 3] = '#';
	}
	n = 2 * n + 1;
	s[n + 1] = '+'; //计算回文子串的数量时,要记得清空,消除之前的字符对当前答案的影响
	//p[i] 为第 i 个字符为中心的最大回文子串的半径(字符串 s 的)
        //p[i] - 1 为原字符串中第 i 个字符的回文串长度
	int mid = 0, r = 0;
	for (int i = 1; i < n; ++ i){
		if (i < r) p[i] = min(p[(mid << 1) - i], r - i);
		else p[i] = 1;
		while (s[i - p[i]] == s[i + p[i]]) p[i]++;
		if (i + p[i] > r){
			r = i + p[i];
			mid = i;
		}
		ans = max(ans, p[i] - 1);  //求最长回文串长度
	}
	cout << ans << "\n";
}
int main(){
	cin >> ss;
	n = strlen(ss);
	manacher();
	return 0;
}

洛谷模板: https://www.luogu.com.cn/problem/P3805
acwing模板: https://www.acwing.com/problem/content/3190/

洛谷题目:
https://www.luogu.com.cn/problem/P1659 前缀和 + manacher
https://www.luogu.com.cn/problem/P4555 manacher
https://www.luogu.com.cn/problem/P5446 manacher
https://www.luogu.com.cn/problem/P6216 kmp + manacher + 前缀和