HDU 3068(manacher模版题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068

题意:求最长回文串的长度。

题解:纯模版。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 const int maxn =200000+50;
 7 char s[maxn<<1];
 8 int p[maxn<<1];
 9 int mxx,iid;
10 void manacher()
11 {
12     mxx=-1;
13     int len=strlen(s);
14     for(int i=len;i>=0;i--)
15     {
16         s[i+i+2] = s[i];
17         s[i+i+1] = '#';
18     }
19     s[0] = '*';
20     int id,mx=0;
21     for(int i=1;i<len+len+2;i++)
22     {
23         if(mx>1) p[i] = min(p[2*id-i],mx-i);
24         if(p[i]==0) p[i]=1;
25         while(s[i-p[i]]==s[i+p[i]])p[i]++;
26         if(i+p[i]>mx)
27         {
28             mx=i+p[i];
29             id=i;
30         }
31         if(p[i]-1>mxx)
32         {
33             mxx=p[i]-1;
34             iid=i;
35         }
36     }
37     printf("%d\n",mxx);
38 }
39 
40 int main()
41 {
42     while(~scanf("%s",s))
43         manacher();
44 }
View Code

 

posted on 2015-07-20 11:41  小松song  阅读(110)  评论(0)    收藏  举报

导航