Lyndon Word and The Runs Theorem
最近回去啃了啃WC的另一份课件,算是为自己两年前的作品写下续章吧。
本文是yjz、xyx、csl三人在WC2019营员交流课件的笔记。
符号和约定
为了方便本文的叙述,采用如下可能不严谨的定义:
我们记表示从第个字符到第个字符组成的子串,当或时,或可以省略,时,可以简记为。
对于字符串,记,如果且并非的前缀,即两者在结束之前就比较出了大小。
一个比较显然的结论是,如果,那么对任意字符串,有且。
定义1
如果字符串满足对于,都有,那么称是一个Lyndon串,即的任意严格后缀都大于本身。
定理1
如果都是Lyndon串,且,那么是Lyndon串。
证明:将的后缀分为三部分:。
对于第一部分,考虑是一个Lyndon串,对于其严格后缀,有,从而有。
对于第二部分,若,则显然;否则是的前缀,有,由是Lyndon串,立得后者成立。
对于第三部分,考虑即可。
定理2
如果是Lyndon串,设为一个字符,那么对于字符串,有:
1.若,那么是任意以开头的字符串的最长Lyndon前缀。
2.若,那么是Lyndon串。
证明:对的情况,由于若并非本身,就是周期串,不可能是Lyndon串。对于剩下的更长的前缀,不妨假设其为,从而有作为后缀,由于,因此,从而不可能是Lyndon串。第一部分得证。
对的情况,将的严格后缀分为以开头的、以的严格后缀开头的和。对于以开头的,假设其为,由,立得,从而;对于以开头的,由立得其小于;最后,由,即得也大于整个串。因此,是Lyndon串。
定义2
对于字符串,若存在一组Lyndon串,满足且,那么称为的Lyndon分解。
定理3
任意字符串的Lyndon分解存在。
证明:采用构造法并对的后缀归纳证明。设是的一组Lyndon分解,由于是Lyndon串,有,对于这组“初步的”Lyndon分解,由定理1,只要开头的两个Lyndon串是小于关系,就合并为一个新Lyndon串,反复操作直到只剩下一个串或者是不小于的关系,就得到了的一组Lyndon分解。
定理4
任意字符串的Lyndon分解唯一。
证明:只要证明的任意Lyndon分解的第一个字符串一定是的最长Lyndon前缀,之后考虑余下的串是的Lyndon分解,归纳证明即可。
反证法,假设存在更长的Lyndon前缀,则该Lyndon分解中,存在一个满足其是第一个右端点位置的串,不妨记为,考虑是Lyndon串,因此,得到,与Lyndon分解是不递增的矛盾。综上所述Lyndon分解唯一。
初步的Lyndon分解算法
在定理4保证了Lyndon分解的唯一性后,定理3实际上给出了一个求Lyndon分解的算法。通过哈希或后缀数组预处理后判断子串的大小关系,并沿用定理3证明中的过程,就可以做到求解Lyndon分解。当然,采用和可以使算法做到,然而这样的实现并不实用。
高效的Lyndon分解算法
通过定理2给我们的启发,有可能找到更好的Lyndon分解算法。考虑将划分为三部分,记录表示已经进行了Lyndon分解,并确定必定是的Lyndon分解的前若干项,而则是一个形如的串,其中是Lyndon串且长度为,则是未知情况的串。
考虑不断进行如下迭代,直到变为:
考察(若,则定义是小于任何字符集中字符的特殊字符),分三类情况:
1.,则的形式继续保持,令自增即可。
2.,则由定理可知,是一个Lyndon串,但是不能保证其一定出现在最终的Lyndon分解中。不过,这仍满足的形式(),于是令自增,而为即可。
3.,则由定理可知,必定是的最长Lyndon前缀。由定理4可知,其一定出现在Lyndon分解中,于是我们将个全部加入已知的Lyndon分解中。对于剩下的,无法保证其满足的形式,干脆重新开始,令指向的第一个字符(单字符必定是Lyndon串),并令。
综上即得Lyndon分解,每次迭代是的,且至少增加。由于,因此整个算法是的,并且有非常简洁的实现。
The Runs Theorem 部分待填坑。