#include<iostream> #include<string> usingnamespace std; string s; int p[2010]; intmain() { string s; getline(cin, s); int len = s.length(), id = 0, maxlen = 0; //迄今为止找到的最右边回文串的中心。 for (int i = len; i >= 0; --i) //将偶回文串也转换为奇回文串 { s[2 * i + 2] = s[i]; s[2 * i + 1] = '#'; } s[0] = '*'; for (int i = 2; i < 2 * len + 1; ++i) { if (p[id] + id > i) //检查以 id 为中心的回文串是否延伸到当前位置 i 之后。 p[i] = p[2 * id - i] < p[id] + id - i ? p[2 * id - i] : p[id] + id - i; //i位于id右侧,2*id-i表示关于id对称的i,p[2 * id - i]表示回文串的半径 //p[id] + id - i表示该回文串不延伸到右边界的最大可能半径。 //为什么这样做呢,因为左边回文串的长度可能大于延伸到左边界的半径,而右边界外的字符串不能确定 else p[i] = 1; //否则置1,朴素算法求p[i] while (s[i - p[i]] == s[i + p[i]]) //朴素算法更新回文字符串的长度 ++p[i]; if (id + p[id] < i + p[i]) //i回文串的右边界已经超出id回文串的右边界,更新id id = i; if (maxlen < p[i]) //更新maxlen maxlen = p[i];