include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
const int N=3*1e7+5000;
char s[N],str[N];
int p[N];
void init()
{
int k=0;
str[k]=’@’;//开头加个特殊字符防止从中间向两边扩散的时候越界
str[k]=’#’; //在每个字符前加个符号来统一奇偶
for(int i=0;s[i];i)
{
str[k]=s[i];
str[k++]=’#’; //在每个字符后也加入一个符号来统一奇偶
}
}
int main()
{
cin>>s;
init();
int id=0,mx=0,maxx=0; //mx就是当前遍历过的最右边的位置,id表示回文子串的中心
for(int i=1;str[i];i++) //跳过第一个特殊字符
{
if(i<mx)//如果i小于mx表示还没超过mx,所以进行判断以i为中心的半径会不会大于mx
{
if(p[2*id-i]<mx-i) //根据之前求过的i的对称点j判断i的半径不会大于mx-i
p[i]=p[2*id-i]; //比较取一个短的
else p[i]=mx-i;
}
else p[i]=1; //大于了就只能保证本身是回文
while(str[i+p[i]]==str[i-p[i]]) //向两边进行扩散
p[i]++;
if(i+p[i]>mx) //如果超出当前的最右边就更新
{
id=i;
mx=i+p[i];
maxx=max(maxx,p[i]);
}
}
cout<<maxx-1;
}
牝
dlddw