hdu 3294 manacher 求回文串

感谢:

http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/

O(n)求给定字符串的以每个位置为中心的回文串长度。

中心思想:每次计算位置i的答案时,利用已经算出的1~i-1位置的答案。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #define maxn 222222
 5 using namespace std;
 6 
 7 int n, ans;
 8 char s[maxn];
 9 int r[maxn];
10 
11 int main() {
12     while( scanf( "%s", s )==1 ) {
13         n = strlen(s);
14         for( int i=n; i>=0; i-- ) {
15             s[(i<<1)+2] = s[i];
16             s[(i<<1)+1] = '#';
17         }
18         s[0] = '^';
19         s[n+n+2] = '$';
20         for( int i=2,id=1; i<=n+n+1; i++ ) {
21             if( id+r[id]>=i ) r[i] = min( r[id+id-i], id+r[id]-i );
22             else r[i] = 0;
23             while( s[i-r[i]-1]==s[i+r[i]+1] ) r[i]++;
24             if( id+r[id]<i+r[i] ) id=i;
25         }
26         ans = 0;
27         for( int i=1; i<=n+n+1; i++ )
28             ans = max( ans, r[i] );
29         printf( "%d
", ans );
30     }
31 }
View Code
原文地址:https://www.cnblogs.com/idy002/p/4311583.html