【BZOJ2342】双倍回文,manacher+并查集优化
来源:互联网 发布:mac安装虚拟机教程 编辑:程序博客网 时间:2024/06/06 09:32
Time:2016.08.16
Author:xiaoyimi
转载注明出处谢谢
传送门
思路: woc第一次写马拉车怎么这么蛋疼啊
p[i]表示以i为中点,能向增长的最多的回文长度的一半
比如”abcba”,s[3]=’c’,p[3]=5/2=2
考虑枚举双倍回文
然后再枚举前半端
j的取值为[i-p[i]/2,i)
这样保证,如果j符合要求那么后半端
ans=max((i-j)*4)
复杂度
网上的优化有很多……
set,树状数组,二分答案,暴力……
真是太神了……
代码:
#include<cstdio>#include<iostream>#include<cstring>#define M 500010using namespace std;int n,len;int p[M<<1];char s[M],a[M<<1];int fa[M];void manacher(){ int id=0,mx=0; for (int i=1;i<=len;i++) { if (mx>i) p[i]=min(p[2*id-i],mx-i); else p[i]=0; for (;a[i-p[i]]==a[i+p[i]];++p[i]); if (i+p[i]>mx) mx=i+p[i],id=i; }}int find(int x){fa[x]=(fa[x]==x?fa[x]:find(fa[x]));return fa[x];}main(){ scanf("%d",&n); scanf("%s",s+1); a[0]='!'; a[++len]='#'; for (int i=1;i<=n;i++) a[++len]=s[i], a[++len]='#'; a[len+1]='?'; manacher(); for (int i=1;i<=n;i++) p[i]=(p[i<<1|1]-1)/2,fa[i]=i; fa[n+1]=n+1; int ans=0; for(int i=1;i<=n;i++) for (int j=find(max((i-p[i]/2),1));j<i;fa[j]=find(j+1),j=fa[j]) if (p[j]+j>=i) {ans=max((i-j)*4,ans);break;} printf("%d\n",ans);}
0 0
- 【BZOJ2342】双倍回文,manacher+并查集优化
- BZOJ2342: [Shoi2011]双倍回文【Manacher】
- [bzoj2342][Shoi2011]双倍回文 manacher
- BZOJ2342 双倍回文 [manacher][set]
- bzoj2342 双倍回文【manacher+set】
- 【bzoj2342】 SHOI2011 双倍回文 manacher+set
- 【BZOJ2342】【Shoi2011】双倍回文 Manacher算法
- [BZOJ2342][Shoi2011]双倍回文(manacher)
- [BZOJ2342] SHOI2011 双倍回文 manacher O(n)
- bzoj2342 [Shoi2011]双倍回文(manacher+暴力/set)
- 双倍回文(BZOJ-2342)(manacher+并查集)
- 【BZOJ2342】【Shoi2011】双倍回文 Manacher+枚举+最优性剪枝
- 【bzoj2342】[Shoi2011]双倍回文
- [BZOJ2342] [Shoi2011]双倍回文
- bzoj2342【SHOI2011】双倍回文
- [bzoj2342][SHOI2011]双倍回文
- 【SHOI2011】bzoj2342 双倍回文
- bzoj2342(双倍回文)
- python3.3+lxml+win7_64
- iSO 获取通知中心宏
- 暑假集训 8.16 数据结构实验之排序三:bucket sort (简单的桶排序)
- JMeter基础--逻辑控制器Logic Controller
- 装逼专用
- 【BZOJ2342】双倍回文,manacher+并查集优化
- spring mvc controller中获取属性文件(properties)的值
- 数学水题
- JavaScript定时器
- 51Nod--1008
- 欢迎使用CSDN-markdown编辑器
- BeanShell in JMeter(Performance Test) —— JMeter中的Beanshell使用
- php 解析xml 的四种方法(转)
- 阅读优秀代码是提高开发人员修为的一种捷径