hdu4513 吉哥系列故事——完美队形II
2015-08-07 15:58
162 查看
题目:
在一个长度为n的数组里面找回文串,要求回文串从中间向两边一次递减
思路:
manacher算法:时间复杂度O(n)
在manacher过程中添加限制语句保证题目要求即可
代码:
在一个长度为n的数组里面找回文串,要求回文串从中间向两边一次递减
思路:
manacher算法:时间复杂度O(n)
在manacher过程中添加限制语句保证题目要求即可
st[i-p[i]]<=st[i-p[i]+2]///表示回文串的左侧部分,前面要比后面的小
代码:
#include <cstdio> #include <iostream> #define MAXN 100010 using namespace std; int p[MAXN<<1]; int st[MAXN<<1]; int h[MAXN]; int n; void manacher(){ st[0]=-2; st[1]=0; for(int i=1;i<=n;++i){ st[i<<1]=h[i]; st[(i<<1)+1]=0; } st[2*n+2]=-3; int len=2*n+1; p[0]=0; int id=0,MaxId=0; for(int i=1;i<=len;i++){ if(MaxId>i) p[i]=min(p[2*id-i],MaxId-i); else p[i]=1; while(st[i-p[i]]==st[i+p[i]]&&<span style="color:#ff0000;">st[i-p[i]]<=st[i-p[i]+2]</span>) p[i]++; if(i+p[i]>MaxId){ id=i; MaxId=i+p[i]; } } } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&h[i]); } manacher(); int maxn=-1; for(int i=1;i<=2*n+1;i++) { if(p[i]-1>maxn) maxn=p[i]-1; } printf("%d\n",maxn); } return 0; }
相关文章推荐
- Linux - sed 工具
- BFS
- HTML5绘制颜色渐变
- JSON字符串和表互相转换
- centos 配置本地yum源
- Team Queue(POJ 2259)
- 第18章 多线程----线程简介
- 【暑假】[实用数据结构]UVAlive 4329 Ping pong
- c++内存池
- Shell中括号的作用
- springmvc+mybatis的配置信息
- Drupal 模块的 Hooks(钩子)
- Java子类继承父类
- 模板方法(Template)设计模式
- mysql中文乱码问题,phpmyadmin操作解决方法
- js判断本机是否已安装app
- Redis 事务
- 利用GPU改善程序性能的一点心得
- lynx
- JAVA代理机制中过的CGLIB代理自己关于的一点小小的理解