洛谷.3805.[模板]manacher算法
2018-03-30 18:38
204 查看
题目链接
之前做很早了没写这篇,补上。
记录当前ex[]最大的回文中心id和最远延伸范围mx!
关于串的构造:
应该是
比如
最优解不改串分奇偶讨论感觉sxbk。。其实也没什么
之前做很早了没写这篇,补上。
记录当前ex[]最大的回文中心id和最远延伸范围mx!
关于串的构造:
应该是
@ #A#B#C#B#A# $,而不是
@ A#B#C#B#A $
比如
@a#b#b#c$,答案应是\(max\{ex[i]\}-1\),而第二种很多情况下答案是\(max\{ex[i]\}\).
最优解不改串分奇偶讨论感觉sxbk。。其实也没什么
#include <cstdio> #include <cstring> #include <algorithm> const int N=22000010; int n,ex ; char tmp[N>>1],s ; void Init() { n=strlen(tmp), s[0]='@'; for(int i=0; i<n; ++i) s[i<<1|1]='#', s[(i<<1)+2]=tmp[i]; s[n=2*n+2]='$', s[n-1]='#'; } void Manacher() { int res=0,mx=0,id; for(int i=1; i<n; ++i) { if(i<mx) ex[i]=std::min(ex[id*2-i],mx-i); else ex[i]=1; while(s[i+ex[i]]==s[i-ex[i]]) ++ex[i]; // if(ex[i]>res) res=ex[i];//不在这更新也是对的,懒得具体想了。。 if(i+ex[i]>mx) id=i,mx=i+ex[i],res=std::max(res,ex[i]); } printf("%d",res-1); } int main() { scanf("%s",tmp), Init(), Manacher(); return 0; }
相关文章推荐
- manacher算法 洛谷3805 manacher
- 洛谷3805:【模板】manacher算法——题解
- 最长回文字符串模板(manacher算法 时间复杂度O(n))
- 洛谷—— P3375 【模板】KMP字符串匹配
- 【模板】带修改莫队 (模板题:洛谷P1903数颜色)
- 洛谷P3388 【模板】割点(割顶)
- 洛谷P3373 [ 模板] 线段树 (乘法和加法)
- 洛谷 P3382 【模板】三分法
- 洛谷 P3386 【模板】二分图匹配
- 【模板】普通平衡树(Treap/SBT) 洛谷 3369 splay
- 洛谷 P1177 【模板】快速排序
- [洛谷3796]【模板】AC自动机(加强版)
- P3372 【模板】线段树 1 洛谷
- 洛谷.3806.[模板]点分治1(点分治)
- 洛谷 1939 【模板】矩阵加速(数列)
- 洛谷 P3383 【模板】线性筛素数(https://www.luogu.org/problem/show?pid=3383)
- 洛谷P3389:【模板】高斯消元法
- 洛谷3384 树链剖分模板
- 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]
- 【洛谷】3807 【模板】卢卡斯定理