HDU4513(manacher模版题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513
题意:给定n给整数,求最长回文串,并且前缀非递减,后缀非递增。
题解:套manacher模版。
时间:280Ms
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int maxn = 1000000+50; 7 int h[maxn<<1]; 8 int p[maxn<<1]; 9 int mxx; 10 void manacher(int n) 11 { 12 mxx=-1; 13 for(int i=n;i>=0;i--) 14 { 15 h[i+i+2] = h[i]; 16 h[i+i+1] = -1; 17 } 18 h[0] = '-2'; 19 int id,mx = 0; 20 for(int i=1;i<2*n+1;i++) 21 { 22 if(mx>1) p[i] = min(p[2*id-i],mx-i); 23 else p[i] = 1; 24 if(p[i]==0) 25 p[i]=1; 26 while((h[i-p[i]]==h[i+p[i]])&&(h[i-p[i]]<=h[i-p[i]+2])) p[i]++; 27 if(i+p[i]>mx) 28 { 29 id=i; 30 mx = p[i] + i; 31 } 32 if(p[i]>mxx) 33 mxx=p[i]; 34 } 35 } 36 int main() 37 { 38 int test; 39 cin>>test; 40 while(test--) 41 { 42 int n; 43 scanf("%d",&n); 44 for(int i=0;i<n;i++) 45 scanf("%d",&h[i]); 46 manacher(n); 47 printf("%d\n",mxx-1); 48 } 49 }
浙公网安备 33010602011771号