2018年7月27日训练笔记

        今天还是补题资料,看NEXT数组求循环节有关资料时,发现数据结构中学KMP时理解的有些不够,于是就多看了一些相关的东西,今天发现平衡树原来是在数据结构中学过的,之前听名字竟然没想起来,概念和操作都有印象但是没有实现过,明天再多看平衡树主席树吧。

                                                     c++ rope 

以下来自:https://www.cnblogs.com/keshuqi/p/6257642.html

g++头文件中,<ext/rope>中有成型的块状链表,在using namespace __gnu_cxx;空间中,其操作十分方便。

基本操作

rope test;

test.push_back(x);//在末尾添加x

test.insert(pos,x);//pos插入x  

test.erase(pos,x);//pos开始删除x

test.copy(pos,len,x);//pos开始到pos+len为止用x代替

test.replace(pos,x);//pos开始换成x

test.substr(pos,x);//提取pos开始x

test.at(x)/[x];//访问第x个元素,直接用数组形式调用下标即可

其算法复杂度n*(n^0.5),可以在很短的时间内实现快速的插入、删除和查找字符串,是一个很厉害的神器!

 

                                                                牛客多校3-E题目提到的循环节有关内容

NEXT数组求字符串的循环节长度:

结论:如果字符串长度为len,那么字符串循环节长度就是len-next[len]

以下证明来自:https://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html

 

个人认为,next数组在求解的过程中,用到了KMP的思想,当前失配了,就回溯到上一个next,请见 j=next[j] ,先说个结论,如果到位置 i ,如果有 i%(i-next(i))==0 那说明字符串开始循环了,并且循环到 i-1 结束,为什么这样呢?

我们先假设到达位置 i-1 的时候,字符串循环了(到i-1完毕),那么如果到第i个字符的时候,失配了,根据next数组的求法,我们是不是得回溯?

然而回溯的话,由于字符串是循环的了(这个是假定的),next[i] 是不是指向上一个循环节的后面一个字符呢??

是的,上一个循环节的末尾是 next[i]-1 ,然后现在循环节的末尾是 i-1 ,然么循环节的长度是多少呢?

所以,我们有 (i - 1) - ( next[i] - 1 ) = i - next[i]  就是循环节的长度(假设循环成立的条件下),但是我们怎么知道这个循环到底成立吗?

现在我们已经假设了 0————i-1 循环了,那么我们就一共有i 个字符了,如果有 i % ( i - next[i] ) == 0总的字符数刚好是循环节的倍数,那么说明这个循环是成立的。

注意还有一点,如果 next[i] == 0,即使符合上述等式,这也不是循环的,举个反例

0   1    2   3   4   5

a    b   c   a   b   d

-1   0   0   0   1   2 

下标为1,2,3next值均为0,那么 i%i-nexti】)=i%i==0,但是这个并不是循环。

解释完毕,然后再来看下,为什么求出来的循环节长度是最小的呢?

因为next数组失配的时候,总是回溯到最近的循环节,所以i-nexti】就是最小的循环节长度

    为什么求出来的循环次数是最多的呢?

    循环节长度是最小的了,那么循环次数肯定是最多的了。

总结一下,如果对于next数组中的 i 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串循环,而且

循环节长度为:   i - next[i]

循环次数为:       i / ( i - next[i] )

 

NEXT数组有关资料

http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html

https://www.nowcoder.com/discuss/88445?type=101&order=0&pos=12&page=0

https://blog.csdn.net/niushuai666/article/details/6965517

https://blog.csdn.net/niushuai666/article/details/6960985

      

 

滚动数组https://blog.csdn.net/niushuai666/article/details/6677982#comments

 

KMP算法

https://blog.csdn.net/niushuai666/article/details/6960985

https://blog.csdn.net/lee18254290736/article/details/77278769

https://blog.csdn.net/starstar1992/article/details/54913261

https://blog.csdn.net/buppt/article/details/78531384

 

猜你喜欢

转载自blog.csdn.net/sdau20163942/article/details/81254797