{Manacher}hdu3068

来源:互联网 发布:中智留学 知乎 编辑:程序博客网 时间:2024/05/21 22:35

最大回文串Manacher算法

1.统一问题:把长度为偶数和奇数的串统一,,\

"abc"->"#a#b#c#";

"abcd"->"#a#b#c#d#"

2.充分利用已知条件:

记p[id]为:以str[id]为中心,最大的回文串半径

str[]=# a # b # c # b # c # c #

p[]=1 2 1 2 1 4 1 2 1 2 3 2 1

可见p[id]-1为实际回文串长度


设两个标记(来避免无谓的重复匹配)

1.mx标记:所有回文串中最右的元素

2.id标记:mx所在回文串的中心

3.实践:

{int mx=0,id;for (int i=1;i<=n;i++){if (mx > i)p[i]=min(p[id-(i-id),mx-i);elsep[i]=1;while (str[i+p[i]==str[i-p[i]])p[i]++;if (p[i]+i>mx){mx=p[i]+i;id=i;}}}

图转自http://blog.csdn.net/ggggiqnypgjg/article/details/6645824


原创粉丝点击