给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
......
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 }