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 }
View Code

 

posted on 2015-07-20 10:33  小松song  阅读(449)  评论(0)    收藏  举报

导航