今天补题遇到字符串,不太会看了题解发现是manachar算法。(复杂度 O(n))
于是屁颠屁颠跑去补。。。
https://blog.csdn.net/dyx404514/article/details/42061017
这篇介绍的很好,容易理解。
下述个人理解,
这个算法真的是设计的很聪明,对性质的利用非常好,普通的暴力就是遍历匹配,而这种算法巧妙地整合了 奇数回文串与偶数回文串的情况。
板子如下:
int mar(string x)
{
string s="*";
int ans=0;
int lenx=x.length();
for(int i=0;i<lenx;i++){
s+='#';
s+=x[i];
}
s+='#';
int c=0,mx=0,lens=s.length();
for(int i=0;i<=lens;i++) p[i]=0;
for(int i=0;i<lens;i++){
p[i]=mx>i?min(p[2*c-i],mx-i):1;
while(s[i-p[i]]==s[i+p[i]]) p[i]++;
if(i+p[i]>mx){
mx=i+p[i];
c=i;
}
ans=max(ans,p[i]);
}
return ans - 1;
}