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\n", ans ); 30 } 31 }