manacher算法是在回文串中增加#号
例如:aaaba
#a#a#a#b#a#
然后用数组len辅助。len【i】的意思是从i为中心的回文串(r-l+1)在i和i之前的长度,即i-l+1
#a#a#a#b#a#
12343212121
每个字母的len值-1就是当前位置的回文串长度
代码:
const int maxn=1000010;
char str[maxn];//原字符串
char tmp[maxn<<1];//转换后的字符串
int Len[maxn<<1];
//转换原始串
void manacher(int n)
{
int len=1;
tmp[0]='@';
for(int i=l[n]; i<l[n+1]; i++)
{
tmp[len++]='#';
tmp[len++]=str[i];
pre[i]=0;
suf[i]=0;
}
tmp[len]='#';
tmp[len+1]='\0';
int mx=0,po=0;
for(int i=2; i<len; i++)
{
if(mx>i)
Len[i]=min(mx-i,Len[2*po-i]);
else
Len[i]=1;
while(tmp[i-Len[i]]==tmp[i+Len[i]])
Len[i]++;
if(Len[i]+i>mx)
{
mx=Len[i]+i;
po=i;
}
}
}