Manacher
char temp[maxn * 2];
int l[maxn * 2];
int manacher(char *str)
{
int len = strlen(str);
temp[0] = '*';
temp[1] = '#';
for (int i = 0; i < len; i++)
{
temp[(i + 1) * 2] = str[i];
temp[(i + 1) * 2 + 1] = '#';
}
int m = 0, k = 0, ans = 0;
for (int i = 0; i <= 2 * len + 1; i++)
{
if (i < m)
l[i] = min(l[2 * k - i], m - i);
else
l[i] = 1;
while (temp[i - l[i]] == temp[i + l[i]])
l[i]++;
if (l[i] + i > m)
{
k = i;
m = l[i] + i;
}
ans = max(ans, l[i] - 1);
}
return ans;
}