回文自動機 初學

2021-07-09 21:15:22 字數 929 閱讀 7820



今天學習了一下回文自動機pam,發現比字尾自動機sam簡單好多啊。。。clj那個sam的ppt講的我頭昏腦漲的(叫你弱叫你弱》_<))。簡單寫一下免得自己忘記。

幾個陣列:

1.像各種自動機一樣,用ch[x][c]表示狀態x後新增字母c之後轉移到的狀態。

2.同樣,用sum[x]表示狀態x所含的回文串的個數(和sam一樣,需要在最後進行統計才能得到完整的答案);用l[x]表示狀態x的回文串的長度;

3.另外,用fa[x]表示狀態樹中x的父親;或者說,和ac自動機裡面的失配函式一樣,表示x匹配失敗後轉移到的狀態。

首先兩個初始狀態0表示長度為偶數的回文串,1表示長度為奇數的回文串。同樣用last表示上一次的字串的狀態編號,假設在x處新增字母c。如果s[x-l[last]-1]!=s[x]就一直沿著失配邊往上走,直到相等為止,設此時狀態為p。但是會不會出現死迴圈呢?會的。但是沒關係,如果令fa[0]=fa[1]=1且l[1]=-1,就會發現最終會變成s[x-l[1]-1]=s[x]==s[x]就停下來了。那為什麼不是fa[0]=fa[1]=0呢?因為單個位元組長度為1是奇數嘛。

好了出現s[x-l[p]-1]=s[x]之後怎麼辦呢?首先看有沒有ch[p][c],如果沒有就要新建節點now,且l[now]=l[p]+2因為加上了最前面後最後面的兩個。另外,新節點的fa[now],則根據fa[p]得到(和ac自動機是不是一樣呢?),在fa[p]往上走時出現的第乙個s[x-l[q]-1]==s[x]即fa[now]。

不管有沒有新增節點,最後都要將ch[p][c]=now且sum[now]++。新增過程就沒了(沒了?沒了!)

然後我們發現新增狀態的順序就是樹的乙個拓撲序,然後就可以和sam一樣得到了。

好了沒了!!??!!確實簡單!(麻麻再也不用擔心我不會背manacher啦(好像manacher更簡單←_←)!)

by lych

2016.2.7

初學回文自動機

回文這個東西,有一些不錯的演算法。比如馬拉車演算法,就是一種非常優秀的演算法。我也學過一篇有關馬拉車的文章,非常的簡單易懂。但我們今天講的是比馬拉車更強的演算法 回文自動機。回文自動機和ac自動機有一些類似的地方,所以有興趣的同學可以看這篇文章來了解 ac自動機 好了,在開始今天的正文之前,我們得先...

初學回文自動機

回文自動機,據說是解決回文問題的利器。最近剛好遇到一道回文問題,加上正好閒著沒事幹,就來學了學。感覺板子還是非常簡潔的,容易記憶。與一般自動機類似,定義乙個節點的資訊。一般包括表示長度 fail 指標 後繼節點,當然視具體題目還要維護一些特殊資訊。但也要注意回文自動機與一般自動機的區別,就是它的後繼...

回文自動機

回文自動機,又叫回文樹,是由俄羅斯人 mikhailrubinchik於2014年夏發明的 這是一種比較新的資料結構,在原文中已有詳細介紹與 實現。回文樹其實不是嚴格的樹形結構,因為它有是兩棵樹,分別是偶數長度的回文樹和奇數長度的回文樹,樹中每個節點代表乙個回文串。為了方便,第一棵樹的根是乙個長度為...