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
阅读全文
0 0
- manacher算法小计
- 算法小计
- 算法小计
- Manacher算法
- Manacher算法
- Manacher算法
- Manacher算法
- Manacher 算法
- manacher算法
- manacher 算法
- Manacher算法
- manacher算法
- manacher算法
- manacher算法
- Manacher 算法
- Manacher算法
- manacher算法
- Manacher算法
- 杭电 Time To Get Up
- java 注解annotation(二)
- Linux常用命令
- 不懂GPU深度学习,何以谈人工智能?
- XSS编码初析
- manacher算法小计
- MYEclipse 安装svn
- (新零售)商户网格化运营
- 【SSD】SSD caffe编译不通过
- 关于logback.xml文件 日志输出位置的问题
- Excel Sheet Column Title
- Dubbo序列化
- Myeclipse的安装与破解
- 解决php mail发送邮件收不到的问题