hdu 3068 最长回文子串(马拉车算法)

求最长回文子串的长度,字符串非常长,我们采用复杂度为线性的manacher算法。

马拉车算法:

http://www.cnblogs.com/biyeymyhjob/archive/2012/10/04/2711527.html

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 const int N = 110010;
 7 char str[N];
 8 char tmp[N << 1];
 9 int len[N << 1];
10 
11 int convert( char * st, char * dst )
12 {
13     int l = strlen(st);
14     dst[0] = '@';
15     for ( int i = 1; i <= 2 * l; i += 2 )
16     {
17         dst[i] = '#';
18         dst[i + 1] = st[i / 2];
19     }
20     dst[2 * l + 1] = '#';
21     dst[2 * l + 2] = 0;
22     return 2 * l + 1;
23 }
24 
25 int manacher( char * st, char * dst )
26 {
27     int l = convert( st, dst );
28     int mx = 0, ans = 0, po = 0;
29     for ( int i = 1; i <= l; i++ )
30     {
31         if ( mx > i )
32         {
33             len[i] = min( mx - i, len[2 * po - i] );
34         }
35         else
36         {
37             len[i] = 1;
38         }
39         while ( dst[i - len[i]] == dst[i + len[i]] )
40         {
41             len[i]++;
42         }
43         if ( len[i] + i > mx )
44         {
45             mx = len[i] + i;
46             po = i;
47         }
48         ans = max( ans, len[i] );
49     }
50     return ans - 1;
51 }
52 
53 int main ()
54 {
55     while ( scanf("%s", str) != EOF )
56     {
57         int o = manacher( str, tmp );
58         printf("%d\n", o);
59     }
60     return 0;
61 }

 

posted @ 2015-07-25 10:04  hxy_has_been_used  阅读(391)  评论(0编辑  收藏  举报