2016.8.6 学习总结
manachar
补上那天的manachar。
manachar是一种能够快速找到字符串中的回文串的一种处理字符串的方法。
核心思想就是:通过回文串是左右对称的这样的一个绝对成立的道理。能够通过左边已经求出的对称中心的数据直接赋值给完全相同的右边的对称中心,这就能节省较多的时间,从而使时间复杂度降了一维。与此同时,回文中心和边界要尽量往右边(远处)延伸。在我完全理解了这种算法后,我觉得也不过就是暴力的一种剪枝罢了。
想了想,先不给出manachar的模板。
manachar还有一个比较重要的细节。那就是,当没有对称中心,也就是回文串的字符个数为偶数个的时候,该怎么赋值呢??
其实也是一样的道理,这时候只需要把字符串的两边以及每个字符之间的间隔里面插入一个‘#’或者是其他题目之外的字符。但最好不要是ASCII码的第0个。因为在char数组中要使用strlen()来得出字符串长度时,就会报错。因为strlen()是根据顺次寻找,直到找到ASCII码的第0个就结束查找。所以最好不要用ASCII的第0个。
现在就一定保证有对称中心了,那就怎么办呢?
给模板lor。
1.读入
2.用插入‘#’的方式处理字符串
3.用manachar算法暴力判断字符串
a.如果现在询问的对称中心在大回文中心的左边,那就暴力查找,得出数据
b.如果现在询问的对称中心在大回文中心的右边,那就直接使用左边的数据
c.如果现在询问的对称中心的最右端超过原回文中心的最右端,那就更新回文中心为现在询问的字符串,同时处理新回文中心的边界。
4.得出整个manachar数据,可以用线性的时间得出所有答案
其实manachar也是一种很水的算法嘛,并没有什么难度。
那么我们就来分析一下它的时间复杂度,以及它为什么可以这么快【地心引力根本拉不住 。
有人一定想要问。有没有可能每次都像暴力一样,因为暴力的查找而达到N^2的时间复杂度呢??
too young!
要解释清楚,就必须得配合一段程序来解释。
int bj=0; // bj就是边(bian)界(jie)的意思
<span style="white-space:pre"> </span>
int id=0; // id就是当前最大的对称中心size=x;for (int i=1;i<=size;i++){if (bj>i) if (p[2*id-i]<bj-i)p[i]=p[2*id-i];else p[i]=bj-i;else p[i]=1;while(now[i-p[i]]==now[i+p[i]]) p[i]++;if (i+p[i]>bj){bj=i+p[i];id=i;}}
有了这段程序,就可以看到,中间的while里面,虽然跟暴力的一样,外面的for也跟暴力的差不多。
有喷子肯定要说:你这个【消音】这两个嵌套起来不就是N^2的时间复杂度了嘛?但是我们从整体的角度来看。
中间的while每执行一次,里面的边界就会扩大一次,然而这只会在左边这样执行。到了对称中心的右边,
它之前执行过的就不会再次查找,而是可以通过大的回文中心来直接得出答案。这不就很少了嘛?
喷子:“那么,你bibi了这么久,时间复杂度到底是多少?”我们现在就来算。
首先,我们已经知道,只需要把左边的查找一次,而右边的不需要查找。
并且,他每查找一次就节省了右边相应的查找次数,同样的每一次查找都至少前进一次。
那么查找的总次数就是N。然后,外面的for循环也是N次的。在N次的循环里做一共做N次所以时间复杂度就是O(N)。
如果你非要认为是O(N^2)就请从头再看一次博客吧。我也帮不了你了。
现在也没什么好讲的了,manachar就是这么简单,不复来打我吖~
既然没什么讲的了,那我还是说两句话吧
真的就两句。
。。。
题目+题解。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std ;
int p[220005];
int main()
{char str[110005],now[110005];while ((scanf("%s",str))!=EOF){int size=0;size=strlen(str);now[0]='!';now[1]='#';int x=1;for (int i=0;i<size;i++){now[++x]=str[i];now[++x]='#';}memset(p,0,sizeof p);int bj=0;int id=0;size=x;for (int i=1;i<=size;i++){if (bj>i) if (p[2*id-i]<bj-i)p[i]=p[2*id-i];else p[i]=bj-i;else p[i]=1;while(now[i-p[i]]==now[i+p[i]]) p[i]++;if (i+p[i]>bj){bj=i+p[i];id=i;}}int max_=0,ii;for (int i=1;i<size;i++)if (p[i]>max_){max_=p[i];ii=i;}max_--;int s=ii-max_;int e=ii+max_;int ans=0;for (int i=s;i<=e;i++)if (now[i]!='#') ans++;printf("%d\n",ans);}return 0;
}
END.
2016.8.6 学习总结相关推荐
- 你们的2016年前端学习计划是什么?
2015年,软件开发界发生了很多变化.有很多流行的新语言发布了,也有很多重要的框架和工具发布了新版本.下面有一个我们觉得最重要的简短清单,同时也有我们觉得值得你在2016年花时间精力去学习的新事物的一 ...
- 计算机专业知识PPT讲演,2016计算机专业学习建议演讲.ppt
2016计算机专业学习建议演讲 教学计划制订 第一学年 第二.三学年 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client P ...
- 2016最新前端学习计划
一.前端学习路线图 二.前端学习路线图--视频篇 六大 阶段 学完后目标 知识点 视频资源(附笔记+PPT+模板 +源码) 密码 准备篇 学习周期:15天 学完后目标: 1.熟悉媒体查询和响应式设计, ...
- Deep Learning Trends @ ICLR 2016:深度学习趋势@ICLR2016(译)
Preface 这是一篇译文,原文作者是Tomasz Malisiewicz大神,这是他在博客Tombone's Computer Vision Blog的文章,一发出来就引起这个圈子的广泛关注. ...
- 2016最新Java学习计划
一.Java学习路线图 二.Java学习路线图--视频篇 六大阶段 学完后目标 知识点 配套免费资源(视频+笔 记+源码+模板) 密码 第一阶段 Java基础 入门 学习周期: 35天 ...
- 收集2016年值得学习的源码、第三方和插件
一:源代码实例 一个针对iOS模块化开发的解决方案 快速搭建项目源代码 模仿网易新闻做的精仿网易新闻 支付宝高仿版 高仿百度传课iOS版 模仿一元云购 wordpress源代码 v2ex源代码(文章类 ...
- 2016年英语学习——2月
感觉此片文章与提高班的英语学习有着很多相同的地方,希望可以激发我和和我一样英语薄弱的人. 一.本文议题及适用对象 1.议题:这是一篇关于"如何学习英语口语"的文章.笔者会基于自身 ...
- Light-weight Contexts An OS Abstraction for Safety and Performance(OSDI 2016)论文学习
论文地址:https://www.usenix.org/conference/osdi16/technical-sessions/presentation/litton 论文官网:http://www ...
- 转载 2016最新Java学习计划
一.Java学习路线图 二.Java学习路线图--视频篇 六大阶段 学完后目标 知识点 配套免费资源(视频+笔 记+源码+模板) 密码 第一阶段 Java基础 入门 学习周期: 35天 ...
- IntelliJ IDEA 2016.3.1 学习git 码云插件 学习笔记
2019独角兽企业重金招聘Python工程师标准>>> File-Settings 搜索不到的话去这里下载https://plugins.jetbrains.com/idea/plu ...
最新文章
- Visual与IMU多传感器融合的定位方案
- 新手提升JSP技术能力的一点建议-调试篇
- linux 分区u盘 fdisk 简介
- DL之GRU:GRU算法相关论文、建立过程(基于TF)、相关思路配图集合、TF代码实现
- jQuery的.live()和.die()
- HTML5变化 (一)
- 归并排序算法图解分析
- 【信源编码】Huffman Coding原理以及MATLAB实现
- chrome pdf 打印边距问题处理
- 抖音5×5一笔连线问题无解的证明
- 如何利用云流送(Cloud Streaming)构造一个全三维、沉浸式的数字化虚拟景区
- Android课程设计,生活记事本
- 完爆面试官!2021Java高频精选面试题讲解
- Java中double转String
- null与undefined的异同点
- UEStudio快捷键
- 清华大学赵明国:AI芯片 +机器人,突破算法瓶颈
- 亚信科技:新业务成高速增长源动力,吹响全栈式数智化转型号角
- python 高等数学实验_Python数学实验与建模
- 深度对话 | V 神纵论区块链和以太坊