int Manacher() // 处理 s 字符串 , 得到其 最长回文串 { int len=strlen(s),id=0,maxlen=0; // 字符串长度 , for(int i=len;i>=0;--i) // 插入 # 解决 , 长度为奇偶的问题 . { //插入'#' s[i+i+2]=s[i]; s[i+i+1]='#'; } //插入了len+1个'#',最终的s长度是1~len+len+1即2*len+1,首尾s[0]和s[2*len+2]要插入不同的字符 s[0]='*'; //s[0]='*',s[len+len+2]=' ',防止在while时p[i]越界 for(int i=2;i<2*len+1;++i) // 完善好字符串之后 , { if(p[id]+id>i) p[i]=min(p[2*id-i],p[id]+id-i); // 如果超过的话 , 右边(p[id]+id-i)的大 如果不超过的话 左边(p[2*id-i])的 大 else p[i]=1; while(s[i-p[i]] == s[i+p[i]]) // 第 26 -- 29 , 32 33 都是为了 减小时间复杂度 来设置的 . p[i]++; if(id+p[id]<i+p[i]) // 这个 id+p[id] 是模式串中已经解决的 最右端 问题 . id=i; if(maxlen<p[i]) maxlen=p[i]; } return maxlen; }