字符串匹配--manacher算法模板
2015-10-11 22:38
232 查看
manacher算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊字符,因此原本长度为偶数的回文串就成了以中间特殊字符为中心的奇数长度的回文串了。
模板是从 kuangbin 巨巨的模板改过来的。
有注释版:
木有注释版:
模板是从 kuangbin 巨巨的模板改过来的。
有注释版:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn=1e6+5; char s[maxn],t[maxn<<1]; //s是原串,t是倍长后的串,p是以某个字符为中心的回文串长度,p[i]-1 就是以 i 字符为中心的回文串在原串中的长度 int p[maxn<<1]; void manacher(){ int len=strlen(s),l=0; //原串从0开始 t[l++]='$'; //开头字符是一个特殊字符 t[l++]='#'; //倍长串中间的间隔都用这个字符 for(int i=0;i<len;++i){ //倍长原串(原串s[i]对应新串t[2*i+2],奇数下标表示两字符中间位置,偶数字符表示原串字符) t[l++]=s[i]; t[l++]='#'; } t[l]=0; //设置新串结尾为0 int maxx=0,num=0; //maxx是已经判断过的最远长度,num是到达最远长度的那个回文串中心字符位置 for(int i=0;i<l;++i){ p[i]=maxx>i?min(p[2*num-i],maxx-i):1; //若当前字符小于已经判断过的最远长度,那么就定初始值是 i关于num对称的位置的回文串长度 和 当前位置到最远距离的长度 的最小值,若还没有判断到过,那么就初始为1 while(t[i+p[i]]==t[i-p[i]])p[i]++; //判断直到不构成回文串 if(i+p[i]>maxx){ //判断是否拓展到更远位置 maxx=i+p[i]; num=i; } } }
木有注释版:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn=1e6+5; char s[maxn],t[maxn<<1]; int p[maxn<<1]; void manacher(){ int len=strlen(s),l=0; t[l++]='$'; t[l++]='#'; for(int i=0;i<len;++i){ t[l++]=s[i]; t[l++]='#'; } t[l]=0; int maxx=0,num=0; for(int i=0;i<l;++i){ p[i]=maxx>i?min(p[2*num-i],maxx-i):1; while(t[i+p[i]]==t[i-p[i]])p[i]++; if(i+p[i]>maxx){ maxx=i+p[i]; num=i; } } }
相关文章推荐
- grep命令与egrep命令详解
- window7下Java环境变量配置图解
- iOS仿京东分类菜单实例实现
- 位图的重新采样以及对大图的重新处理
- explicit
- AccessDiver
- .htaccess 分布式配置文件
- 回溯算法—n皇后问题
- 手机相关的内容(权限自行添加)
- Java基础知识强化之IO流笔记51:IO流练习之 键盘录入学生信息按照总分排序写入文本文件中的案例
- 数字统计之统计页码数字出现的次数
- HDU 5113 Black And White (dfs神剪枝)
- list-style-image 设置li不起作用问题
- 部署网络防火墙
- 图片作为背景,登陆页面相对定位
- svn版本库的拆分及迁移子目录等
- web前端之性能优化
- 安装MVC3后没有dbcontext生成器的解决方案
- 《白帽子讲web安全》第七章 注入攻击 读书笔记(二)
- php数组遍历常用方式