POJ3974 (manacher模版题)

题目链接:http://poj.org/problem?id=3974

题意:给定一个字符串,求最长回文。

题解:manacher算法模版题。

 

代码如下:

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

 

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

导航