标签:
aaaa abab
4 3
#define N 110050
#define M 100005
#define maxn 205
#define MOD 1000000000000000007
void Manacher(char str[],int len){
char tstr[N+N];
int p[N + N],l2 =0,mi;
tstr[l2++] = '#';
for(int i =0;i<len;i++){
tstr[l2++] = str[i];
tstr[l2++] = '#';
}
p[0] = 0;mi = 0;
for(int i = 1;i<l2;i++){
int mi2 = mi + mi - i;
if(mi + p[mi] >= i) p[i] = min(mi2 - (mi - p[mi]),p[mi2]);
else p[i] = 0;
if(p[i] == 0 || mi2 - p[mi2] == mi - p[mi]){
int maxx = p[i]+1;
while(i- maxx >= 0 && i+maxx < l2 && tstr[i-maxx] == tstr[i+maxx]){
maxx++;
}
p[i] = maxx - 1;
}
if(p[i] + i > p[mi] + mi) mi = i;
}
int ans = -1;
for(int i = 0;i < l2;i++){
ans = max(ans,p[i]);
}
printf("%d\n",ans);
}
int main()
{
char str[N];
while(SS(str)!=EOF){
Manacher(str,strlen(str));
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 3068 最长回文串 o(n) Manacher 算法
标签:
原文地址:http://blog.csdn.net/mengzhengnan/article/details/46996287