【學習筆記】lyndon分解

摘抄自quack的ppt。

這部分和 s a sa sa的關聯比較大,可以加深對 s a sa sa的理解。

Part 1

如果字符串 s s s的字典序在 s s s以及 s s s的所有后綴中是最小的,則稱 s s s是一個 lyndon \text{lyndon} lyndon串。

lyndon \text{lyndon} lyndon分解,指的是把一個字符串分成若干段,每一段都是一個 lyndon \text{lyndon} lyndon串,問最少的分割段數。

方法一:用后綴數組 s a [ 1 ] sa[1] sa[1]就是 lyndon \text{lyndon} lyndon分解的最后那一段, lyndon \text{lyndon} lyndon分解倒數第二段就是把 s a [ 1 ] sa[1] sa[1]那一段排除之后排的最靠前的 s a sa sa,以此類推。

s a sa sa可以用來 lyndon \text{lyndon} lyndon分解依賴于以下結論:

定義數組 a [ i ] a[i] a[i]為最小的 j j j,使得 j > i j>i j>i S [ j : ∣ S ∣ ? 1 ] < S [ i : ∣ S ∣ ? 1 ] S[j:|S|-1]<S[i:|S|-1] S[j:S?1]<S[i:S?1],如果不存在這樣的 j j j,可以認為 a i = ∣ S ∣ a_i=|S| ai?=S

那么, S S S lyndon \text{lyndon} lyndon分解的第一項為 S [ 0 : a [ 0 ] ? 1 ] S[0:a[0]-1] S[0:a[0]?1],且后面 m ? 1 m-1 m?1項就是 S [ a [ 0 ] : ∣ S ∣ ? 1 ] S[a[0]:|S|-1] S[a[0]:S?1] lyndon \text{lyndon} lyndon分解。

證明:顯然此時不能劃分到 a [ 0 ] a[0] a[0]之后,否則可以根據原串后綴的信息道出矛盾。因此只需論證劃分到 a [ 0 ] a[0] a[0]合法即可。注意到此時 S [ a [ 0 ] ] ≤ S [ 0 ] S[a[0]]\le S[0] S[a[0]]S[0],因此對于任意 j ∈ [ 1 , a [ 0 ] ? 1 ] j\in [1,a[0]-1] j[1,a[0]?1],一定滿足 S [ 0 : a [ 0 ] ? j ? 1 ] ≠ S [ j : a [ 0 ] ? 1 ] S[0:a[0]-j-1]\ne S[j:a[0]-1] S[0:a[0]?j?1]=S[j:a[0]?1],又因為 s a [ 0 ] < s a [ j ] sa[0]<sa[j] sa[0]<sa[j],因此 S [ 0 : a [ 0 ] ? 1 ] S[0:a[0]-1] S[0:a[0]?1]一定是它的所有后綴當中最小的。

基本性質:

1.1 1.1 1.1 若字符串 u , v u,v u,v lyndon \text{lyndon} lyndon串且 u < v u<v u<v,則 u v uv uv lyndon \text{lyndon} lyndon串。

1.2 1.2 1.2 若字符串 s s s lyndon \text{lyndon} lyndon串, s ′ a s'a sa s s s的前綴,那么 s ′ b ( b > a ) s'b(b>a) sb(b>a) lyndon \text{lyndon} lyndon串。(注意 s ′ a s'a sa不一定是 lyndon \text{lyndon} lyndon串)

方法二:duval 算法

每次維護一個前綴的 lyndon \text{lyndon} lyndon分解。這個前綴 S [ 1 : k ? 1 ] S[1:k-1] S[1:k?1]可以被分解成 s 1 , . . . , s g s_1,...,s_g s1?,...,sg?這些 lyndon \text{lyndon} lyndon串和 S [ i : k ? 1 ] S[i:k-1] S[i:k?1]這個近似 lyndon \text{lyndon} lyndon串(形如 w k w ′ w^kw' wkw w w w是一個 lyndon \text{lyndon} lyndon串, w ′ w' w w w w的前綴)。

具體的,三個變量 i , j , k i,j,k i,j,k維持一個循環不變式:

  • S [ 0 : i ? 1 ] = s 1 s 2 . . . s g S[0:i-1]=s_1s_2...s_g S[0:i?1]=s1?s2?...sg? 是已經固定下來的分解,滿足 s l s_l sl? lyndon \text{lyndon} lyndon串,且 s l ≥ s l + 1 s_l\ge s_{l+1} sl?sl+1?(否則可以合并)。
  • S [ i : k ? 1 ] = t 1 t 2 . . . t h v S[i:k-1]=t_1t_2...t_hv S[i:k?1]=t1?t2?...th?v是沒有固定的分解,滿足 t 1 t_1 t1? lyndon \text{lyndon} lyndon串, t 1 = t 2 = . . . = t h t_1=t_2=...=t_h t1?=t2?=...=th? v v v t h t_h th?的(可為空的)真前綴,令 j = k ? ∣ t 1 ∣ j=k-|t_1| j=k?t1?

在這里插入圖片描述

復雜度為 O ( n ) O(n) O(n)比sa快啊

代碼

Part 2

lyndon \text{lyndon} lyndon分解的應用:

1.3 1.3 1.3 給定長為 n n n的字符串 S S S,求出 S S S的最小表示法。

方法:將 S S SS SS lyndon \text{lyndon} lyndon分解,找到分解后最后一個字符串,它的首字符為 S S [ p ] SS[p] SS[p],且 p ∈ [ 0 , ∣ S ∣ ) p\in [0,|S|) p[0,S)。可以證明 S S [ p : p + ∣ S ∣ ? 1 ] SS[p:p+|S|-1] SS[p:p+S?1]是字典序最小的。(運用第一條引理,轉化為比較在原串中的后綴,即sa)

1.4 1.4 1.4 給定長度為 n n n的字符串 S S S,將 S S S分為最多 k k k個串 c 1 c 2 . . . c k c_1c_2...c_k c1?c2?...ck?,求 max ? c i \max c_i maxci?的最小值。

方法:看到字典序,容易想到 lyndon \text{lyndon} lyndon分解。首先把 S S S lyndon \text{lyndon} lyndon分解成 s 1 , . . . , s g s_1,...,s_g s1?,...,sg?,如果 k ≥ g k\ge g kg,那么答案即為 s 1 s_1 s1?;否則,如果 s 1 > s 2 s_1>s_2 s1?>s2?,那么顯然可以分成 s 1 s_1 s1?和剩下的所有串,答案還是 s 1 s_1 s1?。因此,考慮分解成 s 1 m s g s_1^ms_g s1m?sg?的情況,如果 k > m k>m k>m,那么答案還是 s 1 s_1 s1?,如果 k ≤ m k\le m km,那么盡量均分一下即可。

推廣:多次詢問,每次詢問 S S S的一段后綴的答案。

考慮求出原串的sa數組,顯然可以求出第一項以及重復次數(可以用哈希),這樣就做完了。

1.5 1.5 1.5 S S S的每個前綴的字典序最小的后綴

首先把 S S S lyndon \text{lyndon} lyndon分解成 s 1 , . . . , s g s_1,...,s_g s1?,...,sg?,顯然 s 1 . . . s k s_1...s_k s1?...sk?的字典序最小的后綴是 s k s_k sk?。但是前綴取到分解出來的 lyndon \text{lyndon} lyndon串半截時,答案可能不一樣。

考慮 duval \text{duval} duval算法求 lyndon \text{lyndon} lyndon分解的過程,分類討論:

  • s [ k ] > s [ j ] s[k]>s[j] s[k]>s[j],此時 a n s [ k ] ans[k] ans[k]應該等于 i i i,因為 s [ i : k ] s[i:k] s[i:k]構成一個新的 lyndon \text{lyndon} lyndon
  • s [ k ] = s [ j ] s[k]=s[j] s[k]=s[j],此時 a n s [ k ] = a n s [ j ] + k ? j ans[k]=ans[j]+k-j ans[k]=ans[j]+k?j
  • s [ k ] < s [ j ] s[k]<s[j] s[k]<s[j],在 lyndon \text{lyndon} lyndon串開頭時更新

1.6 1.6 1.6 S S S的每個前綴的字典序最大的后綴

首先把字符比較反過來,然后要盡量向左取,當 s [ k ] ≤ s [ j ] s[k]\le s[j] s[k]s[j]的時候, s [ i : k ] s[i:k] s[i:k]這一段都保持了是一個近似 lyndon \text{lyndon} lyndon串,所以都取近似 lyndon \text{lyndon} lyndon串的左端點 i i i作為答案即可。

ps:感覺這個算法就只能考論文題。。。太惡心了。。。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211602.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211602.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++ 類和對象-封裝意義一

屬性和行為作為整體 示例一&#xff1a;設計一個圓類&#xff0c;求圓的周長 #include<iostream> using namespace std; //圓周率 const double PI 3.14; //設計一個圓類&#xff0c;求圓的周長 //圓求周長的公式&#xff1a;2*PI*半徑 //class代表設計一個類&#xf…

熔池處理Tecplot 360 和CFD-Post做出一樣的效果

熔池處理Tecplot 360 和CFD-Post做出一樣的效果 效果展示詳細講述Tecplot 360實現過程分析實現過程第一步實現過程第二步界面美化注意點效果展示 詳細講述Tecplot 360實現過程 分析 這里主要是將體積分數大于0.5的區域抽取出來,然后顯示溫度場,所以這里主要考慮下面連個思考…

PCL 三維點云中求解圓的三維方程

一、概述 在給出的三維點云中求解擬合圓的三維方程 二、代碼示例 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/sample_consensus/ransac.h> #include <pcl/sample_consensus/sac_model_circle3D.h> // 擬

【貪心算法】 Opponents

這道題寫偽代碼就好了&#xff01; Description Arya has n opponents in the school. Each day he will fight with all opponents who are present this day. His opponents have some fighting plan that guarantees they will win, but implementing this plan requires pr…

【開源】基于Vue+SpringBoot的固始鵝塊銷售系統

項目編號&#xff1a; S 060 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S060&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S060&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 數據中心模塊2.2 鵝塊類型模塊2.3 固…

Mybatis-plus中wrapper的區別

在MyBatis-Plus框架中,LambdaQueryWrapper 和 QueryWrapper 是用于構建查詢條件的兩個主要類。它們都是查詢條件構造器,用于在查詢中生成 WHERE 子句的條件。 QueryWrapper QueryWrapper 是 MyBatis-Plus 3.x 中引入的條件構造器。它的主要特點是使用字符串作為字段名,并支…

python 數字保留小數位數 結果是字符串

precision 2 f{px :.{precision}f} # 自定義動態 f{x:.2f} 數字 轉 字符串 保留dot后面的位數 結果 字符串

從關鍵新聞和最新技術看AI行業發展(2023.11.20-12.3第十一期) |【WeThinkIn老實人報】

Rocky Ding 公眾號&#xff1a;WeThinkIn 寫在前面 【WeThinkIn老實人報】旨在整理&挖掘AI行業的關鍵新聞和最新技術&#xff0c;同時Rocky會對這些關鍵信息進行解讀&#xff0c;力求讓讀者們能從容跟隨AI科技潮流。也歡迎大家提出寶貴的優化建議&#xff0c;一起交流學習&…

MySQL概述-安裝與啟動

數據庫相關概念 MySQL數據庫 下載地址 MySQL :: Download MySQL Installer (Archived Versions) 啟動方法 啟動密令&#xff1a;net start mysql80 停止密令&#xff1a;net stop mysql80 客戶端鏈接方法 注意用系統自帶的命令行工具執行指令需要設置環境在高級系統設置中…

解決使用pnpm安裝時Sharp模塊報錯的方法

在使用pnpm進行項目依賴安裝的過程中&#xff0c;有時候會遇到Sharp模塊報錯的情況。Sharp是一個用于處理圖像的Node.js模塊&#xff0c;但它的安裝可能會因為各種原因而失敗&#xff0c;導致項目無法正常啟動。本文將介紹這個問題的方法。 問題描述 解決方法 在命令行分別輸…

Linux-幫助命令的使用和練習(type、man、help、info詳解)

目錄 5.3.1 type-判斷是否為內部命令 5.3.2 man-查看詳細文檔 5.3.3 help-查看shell內部命令的幫助信息 5.3.4 --help-查看系統外部命令幫助信息 5.3.5 info-查看info格式的幫助指令 5.3.6 /usr/share/doc-存儲軟件包的文檔信息 平時我們看到的命令大多數都可以查看幫助文…

NTP反射放大攻擊

文章目錄 什么是NTPNTP反射放大攻擊解決方案搭建NTP服務器部署服務器端windows NTP命令行本機測試 部署客戶端ntpdatechrony 實驗Python利用腳本 什么是NTP 基于UDP協議的NTP&#xff08;網絡時間協議&#xff09;&#xff1a;使網絡中各個計算機時間同步的一種協議 用途&…

vue3-vite前端快速入門教程 vue-element-admin

Vue3快速入門學習 初始化項目 # 創建項目 npm create vitelatest my-vue-app -- --template vue # 安裝依賴 npm i # 運行 npm run dev 模板語法 文本插值? 最基本的數據綁定形式是文本插值&#xff0c;它使用的是“Mustache”語法 (即雙大括號)&#xff1a; <span&g…

【數據結構】——排序篇(中)

前面我們已經了解了幾大排序了&#xff0c;那么我們今天就來再了解一下剩下的快速排序法&#xff0c;這是一種非常經典的方法&#xff0c;時間復雜度是N*logN。 快速排序法&#xff1a; 基本思想為&#xff1a;任取待排序元素序列中的某元素作為基準值&#xff0c;按照該排序碼…

C++ queue 和priority_queue

目錄 1.什么是queue 2.模擬實現 3.仿函數 模板參數Compare 仿函數 4.什么是priority_queue 模擬實現 1.什么是queue 1.隊列是一種容器適配器&#xff0c;專門用于在FIFO上下文(先進先出)中操作&#xff0c;其中從容器一端插入元素&#xff0c;另一端提取元素。 2.隊列作為…

Java轉Go學習之旅 | Go入門(1)

入門 命令行參數找出重復行常規版本涉及文件操作 命令行參數 命令行參數以os包中Args名字的變量供程序訪問&#xff0c;在os包外面&#xff0c;使用os.Args這個名字 變量os.Args是一個字符串sliceos.Args[0]&#xff1a;命令本身的名字os.Args[1:]&#xff1a;另外的元素&…

Cglib動態代理從入門到掌握

Cglib 動態代理 本文的寫作目的是為了探究 Spring 框架中在使用Transactional標注的方法中使用 this 進行自調用時事務失效的原因&#xff0c;各種視頻教程中只是簡單指出 this 指向的不是代理類對象&#xff0c;而是目標類對象&#xff0c;但是并沒有解釋為什么 this 不是代理…

麒麟系統使用桌面共享遠程桌面

客戶端安裝vinager 服務端 安裝 vnc4server xrdp tightvncserver vino 安裝完成后 需要重啟 在用戶的家目錄下新建 .xsession 寫入xfce4-session防止閃退 雪花屏 開啟xrdp服務 遠程鏈接 Vnc只能鏈接系統登錄的用戶 Rdp可以鏈接所有普通用戶

vscode插件webview和插件通信

如果你要在 VS Code 插件的 WebView 中調用插件中的方法&#xff0c;可以使用 vscode.postMessage API。具體步驟如下&#xff1a; 在插件中&#xff0c;在創建 WebView 時&#xff0c;指定一個 onDidReceiveMessage 回調方法&#xff0c;該方法會在 WebView 中調用 vscode.po…

【C語言】結構體內存對齊

目錄 引入結構體 結構的聲明 創建和初始化 內部元素的使用&#xff1b; 特殊聲明&#xff1a; 結構體在內存中的對齊 練習&#xff1a; 引入結構體 C語言有各種數據類型&#xff0c;我們已經對一些數據類型很熟悉&#xff1a; 整型&#xff08;int&#xff09;- 存儲整…