manacher算法小计

来源:互联网 发布:二手淘宝网店出售 编辑:程序博客网 时间:2024/06/06 02:23

马卡车算法,算是看懂了别人的解释,并自己写出了代码,记录下,防止忘了。

    for(i=1;i<2*slen+2;i++)    {        if(i>mx)        {            P[i] = 1;        }        else        {            if(P[2*id -i] <= (P[id]+id-i)) P[i] = P[2*id -i];            else P[i] = P[id]+id-i;        }        while(*(snew+i+P[i]) == *(snew+i-P[i])) ++P[i];        if(i+P[i] > id+P[id]) id = i;        mx = P[i] + i;    }

关键就是求P[i]

原理就是回文字串的对称性,所有情况包括2大类,第2类包括3小类

第一类:i>mx  (意思就是:目前已知的回文字串还在前面,i在后面,当然给P[i]赋一个初值1,然后在前后看看是否有重复的,有的话给P[i]在自加)

第二类:i<=mx  (意思就是:i在目前这个回文字串中)

2.1 与i关于id对称的,id-(i-id)位置的回文字串也在该回文字串中  因为对称,所以P[i] = P[2*id -i]

2.2 与i关于id对称的,id-(i-id)位置的回文字串不在该回文字串中,左边界超出,这时P[i] = P[id] - (i-id)

2.3 与i关于id对称的,id-(i-id)位置的回文字串与该回文字串左边界相重叠,跟情况1类似,所以P[i] = P[2*id -i],但这种情况p[i]可能更大,所以要继续扩展看看

while(*(snew+i+P[i]) == *(snew+i-P[i])) ++P[i];

看图说话是可以看懂的,但有个疑问,为什么取,他们之间最小的值,还是说取了最小的比较保险,反正接下来要继续扩展匹配。


基本情况就是这样,参考;理解的地址如下:

http://blog.csdn.net/xingyeyongheng/article/details/9310555



原创粉丝点击