Manacher
  gPupDik0w5zI 2023年11月02日 31 0

Manacher

参考:​​Manacher​

模板题:​​P3805 【模板】manacher算法​

用于求最长回文串,复杂度为\(O(n)\),其中​​d1[i]​​​表示以 i 为中心的长度为奇数的回文子串,如​​aaa​​​中,​​d1[0]=1,d1[1]=2​​​,​​d2[i]​​​表示以 i 为右中心的长度为偶数的回文子串,如​​baab​​​中,​​d2[1]=0,d2[2]=2​

马拉车算法的关键在于利用回文串的对称性减少了重复计算。

const int maxn=1e7+1e6+5;
int d1[maxn],d2[maxn]; //d1保存奇数回文串,d2保存偶数回文串
void manacher(string &s){
//回文串的长为 2*d1[i]-1,2*d2[i]
int n=s.size();
for(int i=0,l=0,r=-1;i<n;++i){
int k=(i>r)?1:min(d1[l+r-i],r-i);
while(0<=i-k&&i+k<n&&s[i-k]==s[i+k])
k++;
d1[i]=k--;
if(i+k>r)
l=i-k,r=i+k;
}
for(int i=0,l=0,r=-1;i<n;++i){
int k=(i>r)?0:min(d2[l+r-i+1],r-i+1);
while(0<=i-k-1&&i+k<n&&s[i-k-1]==s[i+k])
k++;
d2[i]=k--;
if(i+k>r)
l=i-k-1,r=i+k;
}
}

CAD加油!欢迎跟我一起讨论学习算法



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xVpghvCvc9NK   2023年11月02日   65   0   0 数组字符串PHP
  Ohl6n170bzPf   2023年11月02日   84   0   0 数组i++字符串
gPupDik0w5zI
作者其他文章 更多

2023-11-02

最新推荐 更多