字符串知识储备

abaaabb

bbaabba

0100011

1100110

如何O(1)判断两个字符串相等

一个想法是先转成2进制,再转成10进制,hash成整数值,O(1)比较

但是这个hash复杂度却是与串长同阶,类似于a*base^2+b

O(1)时间知道hash值就能O(1)比较两个字符串是否相等

baabc

b

ba

baa

baab

baabc

ba

记录前缀的hash值

1*3 ^3+0*3^2+

Hash[l~r]

Pre[x]=Pre[x-1]*26+(S[x]-‘a‘)

Pre[r]=Hash[l~r]

Pre[r] Pre[l-1]

Hash[l~r]

= Pre[r]-Pre[l-1]*26^(r-l)

abba

ab的hash

如何求后缀ba的hash

1*2^3+2*2^2+2*2^1+1*2^0

ab

1*2^1+2*2^0

让ab移位到和abba,*2^(r-l),移两位

这个幂次可以前缀乘O(n)预处理。。不要每次都算

然后让Hash["abba"]-Hash["ab"]

就能得到后缀"ba",的Hash值

由于int或者long long是自然溢出

出题人可能会卡这个模数。。就是两个不同的Hash值。。取模后相同了。。

区间相减。。有可能出现负数。。

然鹅。。-3mod10==7mod10,你-3mod10,本来应该是7,但是你算出来的这个-3可能与其他串hash值相同?

所以我们还是(a-b+mod)%mod,我们还可以用双hash..弄俩模数。。取模不相等才是合法的。。

abababaababacb

ababacb

kmp算法需要观察一个显然成立。。那就是匹配的串其前缀必定相等。。那么。。可能匹配的串其前缀

nxt[]数组:求一个前缀与后缀匹配。。请求出最长的前缀长度。。输出长度和char答案

一个显然的事实:长度为len的前缀和后缀分别只有一个

另一个显然的事实:每一个后缀都是不同的

nxt[]数组求得是除了以i结尾的串的,最长的前缀的长度。。但是这个前缀长度我们一般不会扩展到以i结尾,即1~i的长度(串从1开始)

ababac T

nxt[1]=0;是一个显然的事实

nxt[4]=2

nxt[5]=3

nxt[4]的前缀后面加一格是nxt[5]所考虑的前缀。。nxt[4]的后缀加一格是nxt[5]所考虑的后缀

n/1+n/2+n/3+......+n/n==>nlogn

周期串满足的性质:

应该是len/(len-next[len])
()()()......()一共有n个()。那么next[len]就是n-1个()

所以用len-next[len]就是一个()。然后一除就是答案
可以证明这样一定是最优的

证明的话,我觉得可以反证。就是假设有()比()短是的n
使得n更大
那么nxt也一定更大,矛盾

就比如abcdabcdabcd

设周期串的长度是len

第一个d结尾的nxt等于0

第二个d结尾的nxt等于0+len

同理第n个d结尾的nxt就会等于n-1*len

那么。。LEN=n*len,nxt[LEN]=(n-1)*len,

其实我们本来不知道len是多少。。但是列出此方程就能得出

len=LEN-nxt[LEN]=n*len-(n-1)*len=len;

所以说这个是成立的。。。

时间: 2024-11-04 18:52:57

字符串知识储备的相关文章

新手程序员必备的知识储备有哪些

很多学习了北风网专业课程的朋友,都能如愿到心仪的相关企业任职,首先,北风网向你们表示祝贺,同时关于新手程序员所需要的知识储备情况,特此总结了一篇文章,以供参考: 1.版本控制系统(VCS) VCS 也许是计算机课程最大的疏漏.这些课程光记得教如何写代码,但却往往忘记教学生如何去管理代码.每一个程序员都应该懂得利用 Git 或 Subversion 有效地创建 repository(仓库),编辑与提交代码,进行分支与合并,了解项目工作流. 2.学会写作 身为程序员要写的不只有代码.你还要写项目的发

想要开发自己的PHP框架需要那些知识储备?

作者:安正超链接:https://www.zhihu.com/question/26635323/answer/33812516来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 很多人当听到别人要开发框架的时候第一想法就是,又重复造轮子.其实造轮子的过程是一个快速积累知识的过程,能较快的发现自己的不足,以及学到一些自己未发现的知识点.所以建议在有一定PHP基础的情况下,都去尝试完成一个五脏俱全的基本框架吧. 那么下面分享一下我之前造轮子的过程吧: 1. 尝试试用一个

【问题收集·知识储备】Xcode只能选择My Mac,不能选择模拟器如何解决?

网友问题:请问打开一个应用,只能选择My Mac,不能选择模拟器如何解决? 答案: 下面将问答过程记录如下: CHENYILONG Blog 请问打开一个应用,只能选择My Mac,不能选择模拟器如何解决? 网友的问题 09:59:32 请问打开一个应用,只能选择My Mac,不能选择模拟器如何解决? 我的回答 10:00:32 你打开的是别人的应用吧 网友的问题 10:00:36 对 我的回答 10:01:06 别人的应用,有时候打开xcode是不行的 网友的问题 10:01:22 那有没有什

自定义控件知识储备-LayoutParams的那些事

在上一篇文章里,我总结了一下自定义控件需要了解的基础知识:View的绘制流程--<自定义控件知识储备-View的绘制流程>.其中,在View的测量流程里,View的测量宽高是由父控件的MeasureSpec和View自身的LayoutParams共同决定的.MeasureSpec是什么,上一篇文章里已经说得很清楚了(啥,没看过?快去路克路克,(??????)??).而LayoutParams呢?是时候在这里做个了断了. LayoutParams是什么? LayoutParams,顾名思义,就是

阿里知识储备之二——junit学习以及android单元测试

一,junit框架 http://blog.csdn.net/afeilxc/article/details/6218908 详细见这篇博客 juit目前已经可以和maven项目进行集成和测试,而且貌似不需要单独引入junit的组件就可以(maven自身已经引入?) 注意一下以下几个标记 @BeforeClass,@Before,@Test(timeout = 50),@After,@Before,@Test(expected = Exception.class),@After,@Before,

接口测试学习入门(1)--前期知识储备

接口测试前必需知识了解:1.接口测试的原理: 无论用那种测试方法,接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端,客户端接收应答报文这一个过程. 2.前期知识储备2.1 http知识了解(详见 http://www.blogjava.net/zjusuyong/articles/304788.html 写的很棒!) http端口号 80,不输入默认就是, https端口号 443,基于SSL https加密原理:

爬虫知识储备篇---分析http请求

(1).为何需要进行HTTP请求分析 答:方便我们编写的爬虫精准定位爬取目标 (2).知识储备 1.什么是抓包? 抓包:抓取客户端与服务器之间进行通信时产生的数据包 2.了解抓包工具:chrome下的开发者模式,使用F12即可打开 功能结构分析:(参考文档:http://www.css88.com/doc/chrome-devtools/) Elements(元素面板):用于查看网页源代码HTML中的任一元素,手动修改任一元素的属性和样式且能在浏览器中得到实时反馈 Console(控制台面板):

Python3 列表,元组,字典,字符串知识小结

一.知识概要 1. 列表,元组,字典,字符串的创建方式 2. 列表,元组,字典,字符串的方法调用 3. 列表,元组,字典,字符串的常规用法 二.列表 1 # 列 表 2 3 # 列表基础 4 list_1 = ['a','b','c','d','e','f'] 5 list_2 = ['apple','banana','watermelon','strawberry','banana','apple'] 6 print(list_1) 7 print("##########") 8 #

Linux知识储备

----------------------------------------------------------------------基础----------------------------------------------------------------------------------- 0:查找linux中所有有毒的进程,并将有毒的进程杀掉? 答: 1:连接工具连接不上linux: (1):ping一下.----------------------------------