hdu 3068 最长回文

最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6048 Accepted Submission(s): 2073


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


Source
2009 Multi-University Training Contest 16 - Host by NIT


Recommend
lcy

 1 //312MS    1336K    787 B    C++     
 2 //最长回文串 
 3 #include<stdio.h>
 4 #include<string.h>
 5 #define N 125000
 6 char c0[N],c[2*N];
 7 int p[2*N],n;
 8 int Min(int a,int b)
 9 {
10     return a<b?a:b;
11 }
12 void rebuild() //重构,变成奇数长的串 
13 {
14     n=1;
15     int len=strlen(c0);
16     c[0]='$';
17     for(int i=0;i<len;i++){
18        c[n++]='#';
19        c[n++]=c0[i];
20     }
21     c[n++]='#';
22 }
23 void pk() //模板 
24 {
25     int maxn=0;
26     int id;
27     int mx=0;
28     for(int i=1;i<n;i++){
29         if(mx>i) p[i]=Min(p[2*id-i],mx-i);
30         else p[i]=1;
31         for(;c[i+p[i]]==c[i-p[i]];p[i]++);
32         if(mx<p[i]+i){
33             mx=p[i]+i;
34             id=i;
35         }
36         if(p[i]>maxn) maxn=p[i];
37     }
38     printf("%d\n",maxn-1);
39 }
40 int main(void)
41 {
42     while(scanf("%s",c0)!=EOF)
43     {
44         rebuild();
45         pk();
46     }
47     return 0;
48 }

 

posted @ 2013-10-01 15:52  heaventouch  阅读(119)  评论(0编辑  收藏  举报