博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串匹配--manacher算法模板
阅读量:6474 次
发布时间:2019-06-23

本文共 1514 字,大约阅读时间需要 5 分钟。

manacher算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊字符,因此原本长度为偶数的回文串就成了以中间特殊字符为中心的奇数长度的回文串了。

模板是从 kuangbin 巨巨的模板改过来的。

有注释版:

1 #include
2 #include
3 #include
4 using namespace std; 5 6 const int maxn=1e6+5; 7 char s[maxn],t[maxn<<1]; //s是原串,t是倍长后的串,p是以某个字符为中心的回文串长度,p[i]-1 就是以 i 字符为中心的回文串在原串中的长度 8 int p[maxn<<1]; 9 10 void manacher(){11 int len=strlen(s),l=0; //原串从0开始12 t[l++]='$'; //开头字符是一个特殊字符13 t[l++]='#'; //倍长串中间的间隔都用这个字符14 for(int i=0;i
i?min(p[2*num-i],maxx-i):1; //若当前字符小于已经判断过的最远长度,那么就定初始值是 i关于num对称的位置的回文串长度 和 当前位置到最远距离的长度 的最小值,若还没有判断到过,那么就初始为122 while(t[i+p[i]]==t[i-p[i]])p[i]++; //判断直到不构成回文串23 if(i+p[i]>maxx){ //判断是否拓展到更远位置24 maxx=i+p[i];25 num=i;26 }27 }28 }

 

木有注释版:

1 #include
2 #include
3 #include
4 using namespace std; 5 6 const int maxn=1e6+5; 7 char s[maxn],t[maxn<<1]; 8 int p[maxn<<1]; 9 10 void manacher(){11 int len=strlen(s),l=0;12 t[l++]='$';13 t[l++]='#';14 for(int i=0;i
i?min(p[2*num-i],maxx-i):1;22 while(t[i+p[i]]==t[i-p[i]])p[i]++;23 if(i+p[i]>maxx){24 maxx=i+p[i];25 num=i;26 }27 }28 }

 

转载于:https://www.cnblogs.com/cenariusxz/p/4870299.html

你可能感兴趣的文章
【学习笔记】阿里云Centos7.4下配置Nginx
查看>>
VuePress手把手一小時快速踩坑
查看>>
dnsmasq安装使用和体验
查看>>
学习constructor和instanceof的区别
查看>>
Vijos P1881 闪烁的星星
查看>>
ABP理论学习之领域服务
查看>>
Qt 控制watchdog app hacking
查看>>
让所有IE支持HTML5的解决方案
查看>>
RDD之五:Key-Value型Transformation算子
查看>>
Windows 搭建Hadoop 2.7.3开发环境
查看>>
percona 5.7.11root初始密码设置
查看>>
Cognitive Security的异常检测技术
查看>>
Impress.js上手 - 抛开PPT、制作Web 3D幻灯片放映
查看>>
生活杂事--度过十一中秋
查看>>
Pyrex也许是一个好东西
查看>>
Java内部类总结
查看>>
WINFORM WPF字体颜色相互转换
查看>>
能力不是仅靠原始积累(三)
查看>>
实战:使用终端服务网关访问终端服务
查看>>
彻底学会使用epoll(一)——ET模式实现分析
查看>>