(1) \(\text{sam}\) 上一條從初始狀態出發的路徑對應一個子串html
(2) \(\text{parent}\) 樹上一個節點能表示的最長的串對應一個前綴/後綴算法
(3) \(len(u)\) 表示節點 \(u\) 能表示的最長串的長度優化
(4) \(fa(u)\) 表示節點 \(u\) 的後綴連接指向的節點,也就是其在 \(\text{parent}\) 樹上的父親spa
(5) 表示兩個後綴的公共前綴的節點是兩個後綴在 \(\text{parent}\) 樹上的 \(lca\)指針
(6) \(R(u)\) 表示節點 \(u\) 的 \(\text{right}\) 集合,\(sz(u)\) 表示 \(R(u)\) 的大小,\(R(u) \subset R(fa(u)), sz(u) < sz(fa(u))\)code
(7) 廣義 \(\text{sam}\) 能夠理解爲一個 \(\text{sam}\) 維護多個串,每一次插入完一個串後將 \(tail\) 指針設爲初始狀態htm
給出兩個串 \(s, t\),求這 \(s, t\) 的最長公共子串,\(|s|, |t| \leq 2.5 \times 10^5\)blog
對於 \(s\) 建 \(\text{sam}\) ,根據 (1) 能夠將 \(t\) 放進 \(\text{sam}\) 匹配,當失配時至關於要要從當前匹配到的串的一個後綴繼續開始匹配,等價於在 \(\text{sam}\) 上跳 \(fa(u)\) 。能夠證實這樣必定能匹配到最長公共子串。字符串
給出 \(n\) 個串,求這個 \(n\) 個串的最長公共子串,\(1 \leq n \leq 10, |s| \leq 10^5\)get
和上題相似的, 仍是取出一個串建 \(\text{sam}\),能夠求出每個節點被多少個串匹配到了,那麼答案就是 \(\max(len(u))\),\(u\) 是被 \(n - 1\) 個串匹配到的節點。考慮每一次匹配到某個節點的時候,根據 (6),其祖先表明的串也會被匹配到,因此每個串匹配完之後還要更新其祖先的匹配次數,暴力向上跳便可。
另一種作法,考慮串數只有 \(10\) ,能夠建一個廣義 \(\text{sam}\) 將全部串放進去,用二進制維護 \(R(u)\) 是否包含來自某個串的後綴,當一個節點包含來自全部串的後綴時,其就能夠對答案產生貢獻。當 \(n\) 比較大的狀況能夠用 \(\text{bitset}\) 或者線段樹合併來維護。
給出一個串 \(s\),以及\(q\) 次詢問,每次詢問 \(s\) 中第 \(k\) 小的子串,重複的子串僅算一次, \(|s| \leq 9 \times 10^4, q \leq 500\)
能夠不考慮 \(\text{parent}\) 樹,只考慮 (1) ,計算出每個節點向下走能走到的路徑數量。因爲要求的是字典序第 \(k\) 小,每一次二分出從這個節點出發應該走的轉移邊的字符是什麼,向下走便可。這樣作複雜度是 \(O(|s|q)\),因爲 \(q\) 不大,足以經過此題。
實際上考慮 \(\text{parent}\) 能夠進一步優化算法的複雜度,考慮原先的 \(\text{parent}\) 樹一個節點表明的多個串都是最長的串的一個後綴,是一棵相似於前綴樹的結構,這樣不能適用於一些字典序上優美的性質。不妨將串反序插入到\(\text{sam}\) 中,這樣每個點能表明的多個串都是最長的串的前綴,這些串從長到短在字典序上必定是有序的。擴展到整棵樹上,根據 \(mn(u) = len(fa(u)) + 1\) ,每一個點表明的字符串都比其祖先表明的字符串的字典序大。因而能夠計算出每一棵子樹表明了多少串,在 \(\text{dfn}\) 序上二分答案便可,複雜度是 \(O(qlogn)\)。
給出一個串 \(s\) ,根據題目要求來求出相同子串算一個或多個的第 \(k\) 小子串 \(|s| \leq 5 \times 10^5\)
第一問和上一題徹底等價,考慮第二問的狀況,一個子串在 \(s\) 中的出現次數就是其對應 \(\text{parent}\) 樹節點的 \(\text{right}\) 集合大小,也就是 \(sz(u)\) ,只須要對於每一條路徑把權值爲 \(sz(u)\) 進行統計便可。
給出一個的串 \(s\),將 \(s\) 全部子串按照字典序排列好相接起來造成一個新串,\(q\) 次詢問,每一次詢問問新串中的第 \(k\) 個字符是什麼,強制在線。\(|s|, q \leq 2 \times 10^5\)
考慮上上題給基於 \(\text{parent}\) 的作法,反序插入後每一個節點表明的字符串在 \(\text{dfn}\) 序上是有序的,因此只要求出每個節點表明的串的數量,而後對 \(\text{dfn}\) 序進行二分求出答案在哪一個節點表明的子串上。考慮一個子串其所表明的串長度是從 \([len(fa(u))+1,len(u)]\) 連續的,能夠直接求出 \(k\) 對應的子串是從節點 \(u\) 對應的後綴的多少位,查找該位置在原串上的字符便可
有一個串 \(s\),\(s\) 的有些位置是非法的,求全部不以非法位置爲結尾的子串 \(a\) ,\(\sum|a|\times tot(a)\) 的值,其中 \(tot(a)\) 表示 \(a\) 在 \(s\) 中的出現次數。\(|s| \leq 2 \times 10^5\)
\(\text{parent}\) 樹上一個節點表明的串的總數就是 \((len(u)-len(fa(u))) \times sz(u)\) ,維護出每個串不含非法位置的 \(\text{right}\) 集合大小後直接求和
給出一個串 \(s\) ,對於其全部後綴 \(t_i, t_j\) ,求 \(\sum len(t_i)+len(t_j) - 2len(lcp(t_i, t_j))\) 的值, \(|s| \leq 5 \times 10^5\)
考慮將串反序插入到 \(\text{parent}\) 樹後,兩個後綴節點的 \(\text{lcp}\) 就是他們的 \(\text{lca}\) ,那麼能夠樹形 \(\text{dp}\) 出以每個節點做爲 \(\text{lca}\) 時獲得的 \(\sum len(t_i)+len(t_j) - 2len(u)\) ,最後對全部節點求和就是答案
給出一個串 \(s\) 和一個序列 \(a\) ,對於全部 \(i\) ,求出 \(lcp(x, y) \geq i\) 的方案數以及知足條件的最大的 \(a_x \times a_y\) \(|s| \leq 3 \times 10^5|a_i| \leq 10^9\)
本質上和上一題作法同樣,考慮第一問只須要求出對於每個節點 \(u\) ,在其子樹裏選出兩個節點 \(\text{lca}\) 爲 \(u\) 的方案數便可,第二問稍有複雜,由於權值可正可負,須要分類討論 \(\text{dp}\) 維護最大值和最小值,便於合併相乘時統計答案
給出 \(n\) 個字符串,求有多少個子串是其中至少 \(k\) 個字符串的子串,\(\sum|s| \leq 10^5, 1\leq k \leq n\)
創建一個廣義 \(\text{sam}\) ,每次插入一個串後維護一下 \(\text{parent}\) 樹上哪些節點的 \(\text{right}\) 集合已經擁有了來自這個串的後綴,這樣每個新增的插入節點都須要向祖先更新這個信息,根據均值不等式分析,插入全部串的總複雜度是 \(O(|s|\sqrt|s|)\)。
考慮能夠直接用線段樹合併維護每個節點的 \(\text{right}\) 集合有哪些串的後綴,所有建完之後向上合併更新祖先的答案,總複雜度 \(O(|s|log|s|)\)。
有一棵 \(n\) 個節點的樹,每一個節點上有一個字符,如今把每一條簡單路徑當作一個串,求本質不一樣的子串數量,\(n \leq 10^5\) 樹的葉子節點數量 \(\leq 10\)
若是一條簡單路徑被另一條簡單路徑包含,那麼其表明的串徹底能夠當作另一個串的子串,因此咱們只須要考慮不被任何串包含的簡單路徑,其數量顯然是葉子節點個數的平方。因而暴力將這些串插入到廣義 \(\text{sam}\) 中對不一樣子串數量計數便可。
一開始有一個空串,一共有 \(n\) 次操做,每一次操做在這個串末尾加一個字符,求每一次操做結束時串中不一樣子串的數量 \(n \leq 10^5\)
\(\text{sam}\) 是在線構造的,每一次插入節點 \(p\) 後維護一下 \(len\) 發生改變的節點對答案的貢獻便可
在當前字符串的後面插入一個字符串
詢問字符串 \(s\) 在當前字符串中出現了幾回?(做爲連續子串) 你必須在線支持這些操做。
喪心病狂的一道題,因爲在線插入串到 \(s\) 後還要維護每個點的 \(sz(u)\) ,因此要動態支持給 \(\text{parent}\) 樹加邊,維護子樹大小能夠轉爲鏈加,用 \(lct\) 來維護便可
給你一個母串和不少詢問串,每次詢問求母串的一段區間在一段連續詢問串中出現最多的詢問串的出現次數和編號 \(1 \leq |s|, q \leq 5 \times 10^5\)
對全部串建一個廣義 \(\text{sam}\) ,每次詢問倍增找到左端點在 \(\text{parent}\) 樹上對應的節點,用線段樹合併維護出每一個節點的 \(\text{right}\) 集合中每一個詢問串的出現次數,區間查詢 \(\max\) 便可
萌萌噠的傳送門= =