學習筆記第五十七節 回文自動機

2021-10-09 07:42:59 字數 1447 閱讀 6426

由於回文自動機的**十分的有趣,以至於半天都沒看懂怎麼實現.

為了解決廣大苦困人民的煩惱,我決定寫一篇針對**的講解

首先回文自動機有兩個根,乙個是偶根,乙個是奇根.

偶根的長度為0,奇根的長度為-1.

為什麼要這樣設定?講完前面部分再說

首先長度表示的是當前點所對應的回文串長度,從偶根或奇根往下遍歷時,在兩邊同時加上轉移邊對應的字元,這樣會使回文串長度+2,當從奇根往下遍歷的時候,可以發現第一步其實只將長度變為了1(奇根的長度為-1,+2後變為1)加了乙個字元,這也滿足了奇根管理長度為奇數的回文串的性質.

轉移邊在上面已經說過了

fail指標,與acam和sam一樣,pam也有自己的fail指標,含義也大致相同,指向的是 不等於當前點本身 的 最長 回文 字尾.

特別的,偶根的fail指標為奇根,奇根指向他自己

在pos位置加入乙個字元c

對於pos-1最長回文字尾所對應的點,不斷的跳fail,直到找到乙個fail祖先p的長度,滿足s[pos-len[p]-1]=s[pos],也就是說在這個p所對應的回文串兩邊加上乙個字元c是可行的,那麼就將p點記錄下來,若不存在這樣的p點?那麼fail指標會一直跳到奇根,發現奇根一定滿足上面的這條式子,所以一定可以找到乙個p,至於為什麼奇根一定合法?相當於本身存在

找到這個p之後,我們看看這個點是否有兒子c,若有,啥都不用做,直接退出,因為當前必定不可能增加乙個新的回文串,否則必定新增了乙個回文串(所以可以想到本質不同的回文串就是總點數-2),那麼新建乙個點now,去找now的fail,發現now的fail去除兩端之後必定是p的fail,那麼我們讓p去找它的fail,直到再找到乙個fail祖先q滿足兩端同時有個c,不存在?奇根一定是答案,那麼就將now的fail連向q的c兒子,若找到了這樣乙個不為奇根的q,那麼c兒子一定存在,考慮對稱性;如果找到的q為奇根?那麼奇根的c兒子要麼存在,要麼就是偶根(編號為0).

同時要注意,要先找fail,再連p和now的轉移,因為若p是奇根,那麼q也必為奇根,如果先連了轉移邊,那麼now的fail就變成了它自己,而不是偶根.

理解到這裡,你就差不多理解了pam,想要提高自己的理解?多去做做sam的題把,因為pam確實沒什麼題.

回文自動機學習筆記

前言 前置知識 初識回文自動機 變數定義 如圖所示加深理解 如圖所示,他每個節點所代表的回文串分別是 從 2 到 5 aa,a,b,aba 這裡這張圖只是增加感性認識,真實構建可能不會出現此形態的自動機。因為 1 號樹是存長度為奇數的回文串,每次操作又要 len 2 為了減少特判,相信這裡大家也能明...

java學習之路 第五十七天

回顧 servlet生命週期 正課 cookie 一 狀態管理 瀏覽器和伺服器互動的時候,有時候需要判斷是否是同乙個使用者傳送的請求。這個時候就需要對資料進行處理。狀態就是資料,管理就是對資料的乙個操作 1.cookie 將資料儲存在客戶端 2.session 將資料儲存在服務端 二 cookie ...

回文自動機(PAM) 學習筆記

無。強行說和kmp有關也是可以的 1.乙個長度為 n 的字串最多有 n 個本質不同的回文子串。2.對於乙個字串 s,如果在其之後新插入乙個字元,那麼最多產生一種新的回文子串。證明 假設加入這個字元之後得到的最長回文字尾為 t,那麼對於長度小於 t 的任何回文字尾,它們必然在更前面的位置出現過。如圖所...