這麼簡單的算法現在才學......

https://segmentfault.com/a/1190000008484167?utm_source=tag-newest#articleHeader3

https://www.cnblogs.com/grandyang/p/4475985.html


1.在字符之間加入‘#’使得所有回文串的長度變成奇數,方便處理

2.p[i]數組記錄以 i 為回文中心最長回文的半徑,p[i]-1剛好就是這個串的長度

3.mr,id兩個變量,id為能延伸到最右端mr的回文子串的對稱軸,此時左端點為 mr*2-i,(這兩個變量和循環變量 i 無直接關系

4.核心代碼:

if (i < mr)
p[i] = min(p[2 * id - i], mr - i);
else p[i]=1;

引用其他博客的圖片:

如果 mr - i > p[i],那麼以 j 為中心的回文串包含在以 id 為中心的回文串里,又因為 i,j 對稱,這樣p[i]就肯定等於p[j]了

如果 mr-i <= p[i],那麼綠框內至少是一樣的,外面的不知道,所以先設成綠框長度,以後在更新

如果 mr<=i,那麼就沒辦法了,只能從1開始算

最後接一個while暴力處理沒處理好的情況,在更新一下id和mr

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
char s[maxn];
char ss[maxn*];
int p[maxn*];//以i为中心最长回文半径
int init(){
int len=strlen(s);
ss[]='$';ss[]='#';
int l=;
for(int i=;i<len;i++){
ss[l++]=s[i];
ss[l++]='#';
}
ss[l]='\0';
return l;//長度
}
int manacher()
{
int len=init();
int maxlen=-;//最長回文長度
int id,mr=;//以id為中心最長回文右邊界mr,
for(int i=;i<len;i++){
if(i<mr)
p[i]=min(p[*id-i],mr-i);
else p[i]=;
while(ss[i-p[i]] == ss[i+p[i]])//不需邊界判斷
p[i]++;
//每走一步i都比較一下,希望mr盡可能遠,更有機會執行i<mr的代碼提高效率
if(mr<i+p[i])
id=i,mr=i+p[i];
maxlen=max(maxlen,p[i]-);
}
return maxlen;
}
int main()
{
scanf("%s",s);
printf("%d",manacher());
}

最新文章

  1. jdbc在mysql下一次执行多条sql脚本
  2. 淘宝UWP--自定义图片缓存
  3. [转载] - QWidget、QMainWindow、QDialog和QFrame的区别
  4. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块
  5. Codeforces 385C Bear and Prime Numbers
  6. bzoj3629[JLOI2014]聪明的燕姿
  7. SAE上使用本地sql文件建表时出错解决方法
  8. org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse
  9. C++_数字时钟
  10. [NOI2005]月下柠檬树(计算几何+积分)
  11. html5 - drag 拖拽
  12. unicode解码
  13. easy ui Uncaught Error: cannot call methods on tooltip prior to initialization; attempted to call method &#39;hide&#39;
  14. P1547 Out of Hay
  15. 基于虹软人证核验 2.0 Android SDK开发集成入门
  16. How to tell if a file is an EXE or a DLL?
  17. 推荐一些socket工具,TCP、UDP调试、抓包工具
  18. VS调试dll
  19. jsp javabean开发模式
  20. 高并发第十三弹:J.U.C 队列 SynchronousQueue.ArrayBlockingQueue.LinkedBlockingQueue.LinkedTransferQueue

热门文章

  1. 【转载】Unity3D的断点调试功能
  2. 003-更改pip的源让下载安装更加快捷
  3. luogu 3389 【模板】高斯消元
  4. CodeForces669E:Little Artem and Time Machine(CDQ分治)(或者用map+树状数组优美地解决)
  5. C/C++获取操作系统、CPU、内存信息(windows和linux)
  6. ajax展示新页面同时传递参数
  7. KVM虚拟机内无agent情况下的监控方法
  8. attachEvent与addEventListener的区别 真实例子
  9. OutputDebugString()输出调试的使用
  10. Linux编写Shell脚本入门