首页 > 其他 > 详细

POJ 3974 Palindrome

时间:2015-04-28 15:35:59      阅读:196      评论:0      收藏:0      [点我收藏+]

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

题意:求一给定字符串最长回文子串的长度

思路:直接套模板manacher算法

code:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 const int MAXN = 1000010;
 6 char Ma[2*MAXN];
 7 int Mp[2*MAXN];
 8 
 9 void Manacher(char s[], int len)
10 {
11     int l = 0;
12     Ma[l++] = S;
13     Ma[l++] = #;
14     for (int i = 0; i < len; ++i)
15     {
16         Ma[l++] = s[i];
17         Ma[l++] = #;
18     }
19     Ma[l] = 0;
20     int mx = 0;
21     int id = 0;
22     for (int i = 0; i < l; ++i)
23     {
24         Mp[i] = mx > i ? min(Mp[2*id-i], mx-i) : 1;
25         while (Ma[i+Mp[i]] == Ma[i-Mp[i]]) ++Mp[i];
26         if (i + Mp[i] > mx)
27         {
28             mx = i +Mp[i];
29             id = i;
30         }
31     }
32 }
33 
34 char s[MAXN];
35 
36 int main()
37 {
38     int cnt = 0;
39     while (scanf("%s", s) != EOF)
40     {
41         if (strcmp(s, "END") == 0) break;
42         int len = strlen(s);
43         Manacher(s, len);
44         int ans = 0;
45         len = 2 * len + 2;
46         for (int i = 0; i < len; ++i) ans = max(ans, Mp[i] - 1);
47         printf("Case %d: %d\n",++cnt, ans);
48     }
49     return 0;
50 }

 

POJ 3974 Palindrome

原文:http://www.cnblogs.com/ykzou/p/4462941.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!