【模板】Manacher

https://blog.csdn.net/qq_43456058/article/details/94588721
这玩意和扩展KMP很像,都是利用了 d p dp dp和贪心的思想(选择最远覆盖距离)。同时利用了状态的相似性。然后类似于“镜面”的对称点转换,做到了 O ( n ) O(n) O(n)的复杂度。

#include<bits/stdc++.h> using namespace std; const int N=1.1*1e7+5; inline int read() { int X=0; bool flag=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();} while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();} if(flag) return X; return ~(X-1); } int len,Len[N*2]; char s[N],str[N*2]; void getstr() { int k=0; str[k++]='@'; for(int i=0;i<len;i++) { str[k++]='#'; str[k++]=s[i]; } str[k++]='#'; len=k; } int manacher() { int R=0,C; int maxx=0; for(int i=1;i<len;i++) { int i_mirror=2*C-i; if(R>i) Len[i]=min(R-i,Len[i_mirror]); else C=i,Len[i]=0; while(str[i+Len[i]+1]==str[i-Len[i]-1]) Len[i]++; if(i+Len[i]>R) { C=i; R=i+Len[i]; maxx=max(maxx,Len[i]); } } return maxx; } signed main() { scanf("%s",s); len=strlen(s); getstr(); printf("%d",manacher()); }

__EOF__

本文作者仰望星空的蚂蚁
本文链接https://www.cnblogs.com/cqbzly/p/17530377.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(6)  评论(0编辑  收藏  举报  
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示