還沒寫完字尾自動機就來寫小結了
其實是莫比烏斯又推不下去了
其實還是迪哥的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...