题目传送门
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define MAXN 100010 * 2
char s[MAXN], str[MAXN];
int p[MAXN];
int len1, len2;
using namespace std;
int main(void)
{
while (scanf_s("%s", s, MAXN) != EOF)
{
int len1 = strlen(s);
//把字符串全部变成奇数
str[0] = '$';
str[1] = '#';
for (int i = 0; i < len1; i++)
{
str[i * 2 + 2] = s[i];
str[i * 2 + 3] = '#';
}
len2 = len1 * 2 + 2;
str[len2] = '*';
//匹配与对比
int mx = 0, id = 0;
for (int i = 0; i < len2; i++)
{//把新的字符串扫一遍
if (i < mx)//如果当前的值在mx中,就寻找对称位子
p[i] = min(p[2 * id - i], mx - i);//找两者的最小值,如果mx-i比p[2*id-i]则会超出范围,反之就超出了就不是回文了
else
p[i] = 1;//不在mx内好好自己遍历
for (; str[i - p[i]] == str[i + p[i]]; p[i]++)
if (p[i] + i > mx)
{//比较和更新
mx = p[i] + i;
id = i;
}
}
int ans = 0;
for (int i = 1; i < len2; i++)
ans = max(p[i], ans);//找p中的最大值
printf("%d\n", ans - 1);
}
return 0;
}