今天还是补题资料,看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,3的next值均为0,那么 i%(i-next【i】)=i%i==0,但是这个并不是循环。
解释完毕,然后再来看下,为什么求出来的循环节长度是最小的呢?
因为next数组失配的时候,总是回溯到最近的循环节,所以i-next【i】就是最小的循环节长度
为什么求出来的循环次数是最多的呢?
循环节长度是最小的了,那么循环次数肯定是最多的了。
总结一下,如果对于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