#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstdlib>
using namespace std;
char p[210000];
char t[210000];
int l[210000];
void manacher()
{
int len=strlen(t);
p[0]='$',p[1]='#';
int pos=2;
for(int i=0;i<len;i++)
{
p[pos]=t[i];
p[pos+1]='#';
pos+=2;
}
p[pos]='\0'; //這行十分重要,不能丟了
int id=0,maxlen=0,index=0,mx=0;//mx代表目前的迴文串能到的最右的位置, id是對稱中軸。
for(int i=1;i<pos;i++)
{
l[i]=mx>i?min(l[2*id-i],mx-i):1; //整個算法的精髓所在
while(p[l[i]+i]==p[i-l[i]]) ++l[i];
if(mx-i<l[i])
{
mx=i+l[i];
id=i;
}
if(l[i]>maxlen)
{
maxlen=l[i];
index=i;
}
}
/*for(int i=2;i<pos;i+=2)
printf("%d ",l[i]);
printf("\n");*/
for(int i=2;i<pos;i+=2)
l[i/2]=l[i]/2;
/*int mid=index/2;
for(int i=mid-l[mid]+1;i<=mid+l[mid]-1;i++)
printf("%c",t[i-1]);
printf("\n");*/
printf("%d\n",maxlen-1); //輸出最長迴文串長度
}
int main()
{
while(~scanf("%s",t))
{
manacher();
}
return 0;
}
馬拉車模板
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.