您的位置:首页 > 其它

hdu 3294 manacher 求回文串

2015-03-03 17:39 253 查看
感谢:
http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/
O(n)求给定字符串的以每个位置为中心的回文串长度。

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

#include <cstdio>
#include <cstring>
#include <iostream>
#define maxn 222222
using namespace std;

int n, ans;
char s[maxn];
int r[maxn];

int main() {
while( scanf( "%s", s )==1 ) {
n = strlen(s);
for( int i=n; i>=0; i-- ) {
s[(i<<1)+2] = s[i];
s[(i<<1)+1] = '#';
}
s[0] = '^';
s[n+n+2] = '$';
for( int i=2,id=1; i<=n+n+1; i++ ) {
if( id+r[id]>=i ) r[i] = min( r[id+id-i], id+r[id]-i );
else r[i] = 0;
while( s[i-r[i]-1]==s[i+r[i]+1] ) r[i]++;
if( id+r[id]<i+r[i] ) id=i;
}
ans = 0;
for( int i=1; i<=n+n+1; i++ )
ans = max( ans, r[i] );
printf( "%d\n", ans );
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: