Manacher 算法
变量
-
s[i]:原字符串,必须不包含#。 -
t[i]:改变后的串。 -
p[i]:回文半径数组。
函数
-
Manacher():求出最长回文串的长度。
char s[N],t[N];
int p[N];
int Manacher(){
t[0]=t[1]='#';
int len=strlen(s);
for(int i=0;i<len;i++){
t[i*2+2]=s[i];
t[i*2+3]='#';
}
int mx=0,ans=1,id;
len=len*2+2;
t[len]=0;
for(int i=1;i<len;i++){
if(i<mx)
p[i]=min(p[2*id-i],mx-i);
else
p[i]=1;
while(t[i-p[i]]==t[i+p[i]])
p[i]++;
if(mx<i+p[i])
mx=i+p[id=i];
ans=max(ans,p[i]);
}
return ans-1;
}

浙公网安备 33010602011771号