字尾自動機小結

2022-03-16 17:57:24 字數 1397 閱讀 8814

還沒寫完字尾自動機就來寫小結了

其實是莫比烏斯又推不下去了

其實還是迪哥的hhh

1,有關新建節點的幾種分類討論要記住,大概$yy$板子還是可以用的

2,字首節點指的是當前點所代表的$endpos$集合所對應的串中有乙個原串的字首。

具體來說就是新建的$p$節點

3,如果維護樹形結構的話一般是$parent$樹,具體的$fa$也是指的樹上的$fa$

4,「乙個$endpos$集合對應多個不同長度的串,長度連續」可以用來求什麼串的個數

5,廣義字尾自動機

《生成魔咒》:

據說是最板子的,求每次加入乙個點的本質不同子串個數總和

剛好運用到上文結論,每次多出來的就是新建節點最長子串長度-最短子串長度

其實寫的時候並不是這個而是另外一種更麻煩的方法

《工藝》:

可以將串開頭的字母放到串末尾,然後求最小字典序

長度翻倍之後在$sam$上暴力找字典序最小即可

《公共串》:

求給定幾個串的最長公共子串

暴力建出乙個串的$sam$,然後在上面跑,失配就跳父親

乙個比較重要的點就是要向父節點上傳,因為你可能並沒有經過父節點但是匹配上了

因為父節點是兒子的字尾

《弦論》:

求第$k$小子串,兩問,乙個是本質不同,乙個是本質相同。

本質不同建出$sam$跑就可以

本質相同需要維護$endpos$集合,因為出現了多次所以做多次貢獻

關於維護$endpos$,對於每個字首節點,在向兒子劃分集合的時候會丟掉那個字首所對應的點

感性理解一下即可,所以每個字首節點的集合大小初值為$1$,然後$topu$合併即可

《諸神眷顧的幻想鄉》:

廣義$sam$

具體構建和普通$sam$類似,先建出$trie$樹,然後記錄當前點$lst$,回溯時改回去就行。

然後題目特點是只有$20$個葉子節點,所以我們可以每個葉子掃一邊來保證不漏

《品酒大會》:

肛道理這題用$sam$真好做

在$parent$樹上倒序$topu$更新即可

《cheat》:

挺好的題

首先我們發現$l_0$具有單調性,所以我們二分,難點在於$check$。

設f[i]為到達第i個位置總共匹配了多少,$g[i$]為第i個位置與之前最多能匹配多少。

我們可以得到dp柿子:$f[i]=\max\limits_$。      

關於為什麼要多乙個$g$是因為複雜度。

在$sam$上亂跳時我們肯定選擇最優的,失配時直接跳父親,但是決策點不能保證從最靠前的點最優。

加入$g$陣列之後我們就可以用單調佇列優化。

《substring》:

$sam+lct$,可以說是板子題,但是是沒見過的板子,挺噁心。

大概就是這樣

字尾自動機題目小結

作為乙個傻叉,這兩天才學了sam,做了幾道題。先是模版 字尾自動機 sam suffix automation struct state state root,last state seq maxn 2 int seq cnt state new int len void extend int w ...

廣義字尾自動機小結

字尾自動機功能很強大,但碰到多串問題就掛。廣義字尾自動機支援多串操作。思想是在每次插入乙個串後,把las設為1即可,其它操作在parent樹上進行表演。bzoj 3277 includeusing namespace std typedef long long ll const int n 3e5 ...

字尾自動機

基礎知識 step i 表示的是字串i在原字串中的位置。pareint i 表示root到parent i 的子串是root到i的最長字尾。字尾自動機遍歷可以得到原字串的所有子串。特殊技巧 一 字尾自動機的不同子串數有兩種求法 1.ans step i step parent i 1 i cnt 2...