Lyndon Word & The Runs Theorem

最近回去啃了啃WC的另一份課件,算是爲自己兩年前的作品寫下續章吧。

本文是yjz、xyx、csl三人在WC2019營員交流課件的筆記。

符號和約定

爲了方便本文的敘述,採用如下可能不嚴謹的定義:
我們記\(w[i:j]\)表示\(w\)從第\(i\)個字符到第\(j\)個字符組成的子串,當\(i=1\)\(j=|w|\)時,\(i\)\(j\)可以省略,\(i=j\)時,可以簡記爲\(w[i]\)
對於字符串\(u,v\),記\(u\lhd v\),如果\(u<v\)\(u\)並非\(v\)的前綴,即兩者在結束之前就比較出了大小。
一個比較顯然的結論是,如果\(u\lhd v\),那麼對任意字符串\(w_1,w_2\),有\(w_1u\lhd w_1v\)\(uw_1\lhd vw_2\)

定義1

如果字符串\(w\)滿足對於\(i=2,3,\dots,|w|\),都有\(w<w[i:]\),那麼稱\(w\)是一個Lyndon串,即\(w\)的任意嚴格後綴都大於\(w\)本身。

定理1

如果\(u,v\)都是Lyndon串,且\(u<v\),那麼\(uv\)是Lyndon串。

證明:將\(uv\)的後綴\((uv)[i:]\)分爲三部分:\(i\in [2,|u|],i=|u|+1,i\in[|u|+2,|uv|]\)
對於第一部分,考慮\(u\)是一個Lyndon串,對於其嚴格後綴\(u[i:]\),有\(u\lhd u[i:]\),從而有\(uv\lhd (uv)[i:]\)
對於第二部分,若\(u\lhd v\),則顯然\(uv\lhd (uv)[|u|+1:]\);否則\(u\)\(v\)的前綴,有\([uv<v]\Leftrightarrow[v<v[|u|+1:]]\),由\(v\)是Lyndon串,立得後者成立。
對於第三部分,考慮\(uv<v<v[i-|u|:]=(uv)[i:],i\in[|u|+2,|uv|]\)即可。

定理2

如果\(u\)是Lyndon串,設\(a\)爲一個字符,那麼對於字符串\(u^ku[:i-1]a,i\in[1,|u|]\),有:
1.若\(a<u[i]\),那麼\(u\)是任意以\(u^ku[:i-1]a\)開頭的字符串的最長Lyndon前綴。
2.若\(a>u[i]\),那麼\(u^ku[:i-1]a\)是Lyndon串。

證明:對\(a<u[i]\)的情況,由於\(u^nu[:i]\)若並非\(u\)本身,就是週期串,不可能是Lyndon串。對於剩下的更長的前綴,不妨假設其爲\(u^ku[:i-1]av\),從而有\(u[:i-1]av\)作爲後綴,由於\(u[:i-1]a\lhd u\),因此\(u[:i-1]av\lhd u^ku[:i-1]av\),從而\(u^ku[:i-1]av\)不可能是Lyndon串。第一部分得證。
\(a>u[i]\)的情況,將\(u^ku[:i-1]a\)的嚴格後綴分爲以\(u\)開頭的、以\(u\)的嚴格後綴\(u[i:]\)開頭的和\(a\)。對於以\(u\)開頭的,假設其爲\(u^{k'}u[:i-1]a(k'<k)\),由\(u\lhd u[:i-1]a\),立得\(u^{k'+1}\lhd u^{k'}u[:i-1]a\),從而\(u^ku[:i-1]a<u^{k'}u[:i-1]a\);對於以\(u[i:]\)開頭的,由\(u[i:]\lhd u\)立得其小於\(u^ku[:i-1]a\);最後,由\(u\leq u[i]<a\),即得\(a\)也大於整個串。因此,\(u^ku[:i-1]a\)是Lyndon串。

定義2

對於字符串\(w\),若存在一組Lyndon串\(u_1,u_2,\dots,u_n\),滿足\(w=u_1u_2\dots u_n\)\(u_1\geq u_2\geq \dots \geq u_n\),那麼稱\(u_1,u_2,\dots,u_n\)\(w\)Lyndon分解

定理3

任意字符串\(w\)的Lyndon分解存在。

證明:採用構造法並對\(w\)的後綴歸納證明。設\(u'_1,u'_2,\dots,u'_m\)\(w[2:]\)的一組Lyndon分解,由於\(w[1]\)是Lyndon串,有\(w=w[1]u'_1u'_2\dots u'_m\),對於這組“初步的”Lyndon分解,由定理1,只要開頭的兩個Lyndon串是小於關係,就合併爲一個新Lyndon串,反覆操作直到只剩下一個串或者是不小於的關係,就得到了\(w\)的一組Lyndon分解。

定理4

任意字符串\(w\)的Lyndon分解唯一。

證明:只要證明\(w\)的任意Lyndon分解的第一個字符串\(w[:i]\)一定是\(w\)的最長Lyndon前綴,之後考慮餘下的串是\(w[i+1:]\)的Lyndon分解,歸納證明即可。
反證法,假設存在更長的Lyndon前綴\(w[:j](i<j)\),則該Lyndon分解\(w[:i]u_2u_3\dots u_n\)中,存在一個\(u_k\)滿足其是第一個右端點位置\(\geq j\)的串,不妨記爲\(w[i':j']\),考慮\(w[:j]\)是Lyndon串,因此\(w[:i]<w[:j]<w[i':j]\leq w[i':j']=u_k\),得到\(w[:i]<u_k\),與Lyndon分解是不遞增的矛盾。綜上所述Lyndon分解唯一。

初步的Lyndon分解算法

在定理4保證了Lyndon分解的唯一性後,定理3實際上給出了一個求Lyndon分解的算法。通過哈希或後綴數組預處理後判斷子串的大小關係,並沿用定理3證明中的過程,就可以做到\(O(n\log n)\)求解Lyndon分解。當然,採用\(\text{SA-IS}\)\(O(n)-O(1)\text{RMQ}\)可以使算法做到\(O(n)\),然而這樣的實現並不實用。

高效的Lyndon分解算法

通過定理2給我們的啓發,有可能找到更好的Lyndon分解算法。考慮將\(w\)劃分爲三部分,記錄\(i,k,p\)表示\(w[:i]\)已經進行了Lyndon分解,並確定必定是\(w\)的Lyndon分解的前若干項,而\(w[i+1:k]\)則是一個形如\(u^ku[:j-1]\)的串,其中\(u\)是Lyndon串且長度爲\(p\)\(w[k+1:]\)則是未知情況的串。
考慮不斷進行如下迭代,直到\(i\)變爲\(|w|\)
考察\(w[k+1]\)(若\(k+1>|w|\),則定義\(w[k+1]\)是小於任何字符集中字符的特殊字符\(\$\)),分三類情況:
1.\(w[k+1]=w[k+1-p]\),則\(u^ku[:j-1]\)的形式繼續保持,令\(k\)自增\(1\)即可。
2.\(w[k+1]>w[k+1-p]\),則由定理\(2\)可知,\(w[i+1,k+1]\)是一個Lyndon串,但是不能保證其一定出現在最終的Lyndon分解中。不過,這仍滿足\(u^ku[:j-1]\)的形式(\(k=j=1\)),於是令\(k\)自增\(1\),而\(p\)\(k-i+1\)即可。
3.\(w[k+1]<w[k+1-p]\),則由定理\(2\)可知,\(u\)必定是\(w[i+1:]\)的最長Lyndon前綴。由定理4可知,其一定出現在Lyndon分解中,於是我們將\(k\)\(u\)全部加入已知的Lyndon分解中。對於剩下的\(u[:j-1]\),無法保證其滿足\(u'^ku'[:j-1]\)的形式,乾脆重新開始,令\(k\)指向\(u[:j-1]\)的第一個字符(單字符必定是Lyndon串),並令\(i=k-1,p=1\)

綜上即得Lyndon分解,每次迭代是\(O(1)\)的,且\(i+k\)至少增加\(1\)。由於\(i,k\leq |w|\),因此整個算法是\(O(n)\)的,並且有非常簡潔的實現。

The Runs Theorem 部分待填坑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章