Lyndon Word學習筆記

2022-04-29 23:15:08 字數 1538 閱讀 7832

定義:對於字串\(s\),若\(s\)的最小字尾為其本身,那麼稱\(s\)為lyndon串

等價性:\(s\)為lyndon串等價於\(s\)本身是其迴圈移位中最小的乙個

任意字串\(s\)都可以分解為\(s = s_1 s_2 \dots s_k\),其中\(\forall s_i\)為lyndon串且\(s_i \geqslant s_\)。且這種分解方法是唯一的

引理1:若\(u, v\)為lyndon串,且\(u < v\),那麼\(uv\)為lyndon串

證明:

要證明\(uv\)為lyndon串只需證明\(uv\)本身為其最小字尾,

我們可以把所有的字尾分為兩類,一類是由\(u\)的字尾加上\(v\)串的來,這部分的相對大小不會改變。

另一類是\(v\)串的字尾,因為\(v\)本身也是lyndon串,我們只需證明\(v > uv\),因為\(v > u\),顯然成立

證明:

設\(pre(s, i)\)表示串\(s\)中\(s[1 \dots i]\)所代表的字首

若有兩種方案,取第一次不同的位置,設\(|s_i| > |s'_i|\)

令\(s_i = s'_i s'_ \dots s'_ pre(s_, l)\)

反證法。根據定義,\(s_i < pre(s'_, l) \leqslant s'_ \leqslant s'_i < s_i\)

矛盾

(下面內容抄襲並補充自參考資料2)

該演算法可以在\(o(n)\)的時間內求出串\(s\)的lyndon分解

測試位址

引理2:若字串\(v\)和字元\(c\)滿足\(vc\)是某個lyndon串的字首,則對於字元\(d>c\)有\(vd\)是lyndon串

證明:和上面同樣的思路,對於\(d\)之前的字尾相對大小不會改變,之後的字尾只會變大

該演算法中我們僅需維護三個變數\(i, j, k\)

\(s[1..i - 1] = s_1 s_2 \dots s_g\)是固定下來的分解,也就是\(\forall l \in [1, g] s_l\)是lyndon串且\(s_l > s_\)

\(s[i .. k - 1] = t_1 t_2 \dots t_h v(h > 1)\) 是沒有固定的分解,滿足\(t_1\)是lyndon串,且\(t_1 = t_2 = \dots = t_h\),\(v\)是\(t_h\)的(可為空的)真字首,且有\(s_g > s[i .. k - 1]\)

當前讀入的字元是\(s[k]\),令\(j = k - |t_1|\)

分三種情況討論

#includeusing namespace std;

const int maxn = (1 << 21) + 1;

char s[maxn];

int main()

while(i <= j)

}return 0;

}

lyndon word

金策—字串選講

學習筆記 Lyndon Word

若乙個字串 s 的最小字尾是它自己,我們稱其為 lyndon 串。等價定義 若 s 是其所有迴圈重構串中字典序最小的串,則 s 是 lyndon 串。任意字串 s 都可以唯一分解成 s s 1s 2.s k 其中 forall s i 為 lyndon 串,且 s i s 存在性證明 先來看乙個引理...

學習筆記 雜湊學習筆記

hash基本原理 hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。它的主要思路是選取恰當的進製,可以...

學習筆記 CentOS 學習筆記01

簡單的做個課堂筆記 虛擬機器用的是vmware,系統是centos cd etc sysconfig network scripts pwdls 顯示列表 cat ifcfg eth0 檢視檔案內容 vi ifcfg eth0 進入vi編輯器 onboot no 原始設定 x逐字刪除 d刪除整行 a...