Skip to main content

Manacher

参考资料

实现

299 Bcpp
int p[N<<1];
int manacher(string s)
{
int n=s.size();
string t="@#";
for(int i=0;i<n;i++)
{
t+=s[i];
t+='#';
}
t+='&';
s=t;
n=n<<1|1;
for(int i=1,l=0,r=0;i<=n;i++)
{
p[i]=i<=r?min(p[2*l-i],r-i+1):1;
while(s[i-p[i]]==s[i+p[i]])p[i]++;
if(i+p[i]-1>r)r=i+p[i]-1,l=i;
}
return n;
}

例题

给出一个只由小写英文字符组成的字符串 SS,求 SS 中最长回文串的长度。

给定长度为 nn 的字符串 SS,求 SS 的最长双回文子串 TT,即可将 TT 分为两部分 X,YX, YX,Y1|X|,|Y|\ge1)且 XXYY 都是回文串。