1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 char s[10000]; // 原字符串
6 char ss[10000]; // 新构造的字符串
7 int r[10000]; // 回文半径
8
9 int manachar() {
10 int loop = 1, len = strlen(s), ans = 0;
11 int max_right = 0, max_mid = 0; // 最大右边界和回文中心
12 //构建新字符串
13 ss[0] = '$';
14 for(int j = 0; j < len; j++) {
15 ss[loop++] = '|';
16 ss[loop++] = s[j];
17 }
18 ss[loop++] = '|';
19 ss[loop++] = '#';
20
21 len = loop;
22 for(int i = 1; i < len; i++) {
23 if(i < max_right) // 根据回文的性质进行的操作
24 r[i] = min(r[2*max_mid-i], max_right-i); // 2*max_mid-i表示i对于中心点的对称点,max_right-i表示边界到i的距离
25 else
26 r[i] = 1; //从1开始
27 while(ss[i+r[i]] == ss[i-r[i]]) // 更新最大半径
28 r[i]++;
29 if(i + r[i] > max_right) { // 更新最大右边界
30 max_right = i + r[i];
31 max_mid = i;
32 }
33 if(r[i] - 1 > ans) // 更新结果
34 ans = r[i] - 1;
35 }
36 return ans;
37 }
38 int main() {
39 int max_lenth;
40 scanf("%s", s);
41 max_lenth = manachar();
42 printf("%d\n", max_lenth);
43 return 0;
44 }