标签:
题目:
在一个长度为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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/mengxingyuanlove/article/details/47340677