码迷,mamicode.com
首页 > 其他好文 > 详细

HDU3068,最长回文

时间:2015-09-08 20:11:10      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=3068

最长回文

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11909    Accepted Submission(s): 4370

 

Problem Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
 
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000

Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
 
Sample Input
aaaa

abab

 

Sample Output
4

3

题意:

......

题解:

manacher算法模板题,就不多解释了,不会这个算法的,赶紧百度一发吧 = =

 1 //bei
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define Maxn 220010
 8 
 9 int p[Maxn];
10 char ch[Maxn],s[Maxn];
11 
12 int Init()
13 {
14     int i,j = 0,len = strlen(ch);
15     s[j++] = $;
16     for (i = 0; i < len; ++i)
17     {
18         s[j++] = #;
19         s[j++] = ch[i];
20     }
21     s[j++] = #;
22     s[j] = \0;
23     return j;
24 }
25 
26 void manacher(int len)
27 {
28     int i,id = 0,mx = 0;
29     p[0] = 0;
30     for (i = 1; i < len; ++i)
31     {
32         if (mx > i)
33             p[i] = min(mx-i,p[2*id-i]);
34         else
35             p[i] = 1;
36         while (s[i-p[i]] == s[i+p[i]])
37             ++p[i];
38         if (p[i] + i > mx)
39         {
40             mx = p[i] + i;
41             id = i;
42         }
43     }
44 }
45 int main()
46 {
47     int i,len;
48     while (~scanf("%s",ch))
49     {
50         len = Init();
51         manacher(len);
52         sort(p,p+len);
53         printf("%d\n",p[len-1]-1);
54     }
55     return 0;
56 }

 

 

 

 

 

HDU3068,最长回文

标签:

原文地址:http://www.cnblogs.com/xuqiugui/p/4792698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!