[bzoj2342][SHOI2011]双倍回文
来源:互联网 发布:淘宝联盟怎么身份认证 编辑:程序博客网 时间:2024/05/16 19:39
2342: [Shoi2011]双倍回文
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1855 Solved: 691
[Submit][Status][Discuss]
Description
Input
输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容。
Output
输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0。
Sample Input
16ggabaabaabaaball
Sample Output
12
HINT
N<=500000
先用
然后暴力枚举中心位置,用之前
虽然是暴力,但是跑的飞快。。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=1000010;int n,p[N<<1];char s[N],ch[N];inline void manacher(){ int maxn=1,id=1,i; for(ch[0]='$',ch[1]='#',i=1;i<=n;++i) ch[i<<1]=s[i-1],ch[i<<1|1]='#'; for(i=1;i<=(n<<1|1);++i){ p[i]=min(maxn-i,p[id*2-i]); while(ch[i+p[i]]==ch[i-p[i]]) ++p[i]; if(maxn<p[i]+i) maxn=p[i]+i,id=i; }}int main(){ int i,ans=0; scanf("%d%s",&n,s); manacher(); for(i=1;i<=(n<<1|1);i+=2){ int now=p[i],o=i+p[i]-1; if(ans>=o-i) continue; while(o>=i){ if(((o-i)/2)%2==0){ int oo=(o+i)/2; if(p[oo]+oo-1>=o){ ans=max(ans,o-i); break; } } o-=2; } } printf("%d\n",ans);}
1 0
- 【bzoj2342】[Shoi2011]双倍回文
- [BZOJ2342] [Shoi2011]双倍回文
- bzoj2342【SHOI2011】双倍回文
- [bzoj2342][SHOI2011]双倍回文
- 【SHOI2011】bzoj2342 双倍回文
- bzoj2342 [Shoi2011]双倍回文
- bzoj2342 [Shoi2011] 双倍回文
- bzoj2342 [Shoi2011]双倍回文
- BZOJ2342: [Shoi2011]双倍回文【Manacher】
- [bzoj2342][Shoi2011]双倍回文 manacher
- [回文自动机]bzoj2342: [Shoi2011]双倍回文
- 【bzoj2342】 SHOI2011 双倍回文 manacher+set
- 【BZOJ2342】【Shoi2011】双倍回文 Manacher算法
- [BZOJ2342][Shoi2011]双倍回文(manacher)
- [BZOJ2342] SHOI2011 双倍回文 manacher O(n)
- bzoj2342 [Shoi2011]双倍回文(manacher+暴力/set)
- 【BZOJ2342】【Shoi2011】双倍回文 Manacher+枚举+最优性剪枝
- bzoj2342(双倍回文)
- Web服务器(1):使用Apache服务器进行搭建
- java 值传递和对象传递
- 内存泄漏的一种方式
- OkHttp全解析
- ASCII Unicode UTF-8互转
- [bzoj2342][SHOI2011]双倍回文
- NSMutableParagraphStyle 实现文本缩进
- 各种滤波算法的比较
- MapReduce从HBase多路径导出数据到Hive
- 【Android】在任何View上添加红点★★★★★★★
- Android Fragment 真正的完全解析(上)
- execel导出和下载
- HDU 3523 最小费用流或KM
- BOS项目练习(流程定义/实例管理,bos用户角色同步activiti用户表组表)