[BZOJ2565]最长双回文串(manacher+讲解)
2018-01-30 16:20
260 查看
题目:
我是超链接题解:
日常废话几句喵喵喵觉得不能再蹲在数据结构里了,虽然还有好多坑没填,先换换思路再说,继续字符串啦,这里是manacher算法啦
要求双回文子串,实际上是求不重叠且相邻的两个回文串拼在一起的最长长度。 一开始读错题了
我们处理好字符串之后,用左右乱搞一下就好
代码:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N=100005; int p[N*2],l[N*2],r[N*2],len;char s[N*2],st ; void manacher() { int maxx=0,pos=0,mx=0; for (int i=0;i<len;i++) { if (mx>i) p[i]=min(p[pos*2-i],mx-i); else p[i]=1; while (i-p[i]>=0 && i+p[i]<len && s[i-p[i]]==s[i+p[i]]) p[i]++; if (p[i]+i>mx) mx=p[i]+i,pos=i; maxx=max(maxx,p[i]); } } int main() { scanf("%s",st); len=strlen(st); for (int i=0;i<len;i++) s[i*2]='#',s[i*2+1]=st[i]; s[len*2]='#'; len=len*2+2; manacher(); int now=0; for (int i=0;i<len;i++) if (s[i]=='#') { while (now+p[now]<i) now++; l[i]=i-now; } now=len-1; for (int i=len-1;i>=0;i--) if (s[i]=='#') { while (now-p[now]>i) now--; r[i]=now-i; } int maxx=0; fo f6af r (int i=0;i<len;i++) maxx=max(maxx,l[i]+r[i]); printf("%d",maxx); }
普及向:
manacher,非常好写好调的回文串算法,在O(n)时间内,求出以每一个点为中心的回文串长度。这个up讲的是极好的,下面是模板了
首先处理字符串不管
mx表示可以走到的最远点(当前已经判断过的能成为回文串的最远长度,这里刚才的up写的是错的!
pos:mx所对应的回文中心。
p[i]:以i为中心的回文串向某一边最多延伸的长度。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N=11000005; int p[N*2],l;char s[N*2],st ; int manacher() { int maxx=0,pos=0,mx=0; for (int i=0;i<l;i++) { if (mx>i) p[i]=min(p[pos*2-i],mx-i); else p[i]=1; while (i-p[i]>=0 && i+p[i]<l && s[i-p[i]]==s[i+p[i]]) p[i]++; if (p[i]+i>mx) mx=p[i]+i,pos=i; maxx=max(maxx,p[i]); } return maxx-1; } int main() { scanf("%s",st); l=strlen(st); for (int i=0;i<l;i++) s[i*2]='#',s[i*2+1]=st[i]; s[l*2]='#'; l=l*2+2; printf("%d\n",manacher()); }
相关文章推荐
- [BZOJ]2565 最长双回文串 Manacher+单调队列
- BZOJ 2565: 最长双回文串 manacher
- 【bzoj 2565】最长双回文串(manacher)
- BZOJ 2565 最长双回文串 哈希+二分+线扫+树状数组
- BZOJ——2565最长双回文串
- 【单调队列DP+manacher】BZOJ2565-最长双回文串
- BZOJ 2565 最长双回文串(哈希)
- BZOJ[2565]最长双回文串 Manacher
- bzoj2565 最长双回文串 manacher
- BZOJ 2565 最长双回文串
- BZOJ 2565: 最长双回文串 [Manacher]
- bzoj 2565: 最长双回文串(manacher)
- BZOJ 2565 最长双回文串 Manacher
- Bzoj2565:最长双回文串:回文自动机
- bzoj2565 最长双回文串
- 最长双回文串 bzoj 2565 回文自动机
- BZOJ2565 最长双回文串
- 【BZOJ2565】最长双回文串(回文树)
- bzoj 2565: 最长双回文串 manachar
- BZOJ2565 最长双回文串(回文树)