https://segmentfault.com/a/1190000008484167?tdsourcetag=s_pctim_aiomsg 讲的超好!
manacher算法理解 回文串分为偶回文串和奇回文串,由于偶回文串无法找到中点,所以这里将偶回文串转换为奇回文 转换方法s="abcde"=>s="$#a#b#c#d#e#" 数组p[i],表示以i为中心的最长回文的半径,p[i]-1刚好是以i为中心的源字符串中的回文长度 从左往右扫描s,求出p数组 mx:延伸到最右边的回文的边界(不包含 ) id:mx对应的中点 现在扫到了i,i关于id对称点是j,p[j]已知,以下分三种种情况 1.i<mx:p[i]=min(p[j],mx-i),i在mx左边 2.i>=mx:p[i]=1 ,i在mx的右边 3.往两边拓展边界 求出p[i]后更新mx即可 为什么复杂度是on? 当且仅当j的边界和mx重合时,i才要向两边扩展,
#include<bits/stdc++.h> using namespace std; #define maxn 100005 char s[maxn],s_new[maxn]; int p[maxn]; int init(){ int len=strlen(s); s_new[0]='$',s_new[1]='#'; int j=2; for(int i=0;i<len;i++) s_new[j++]=s[i],s_new[j++]='#'; s_new[j]='