前言:
前置知識:
初識回文自動機:
變數定義:
如圖所示加深理解:
如圖所示,他每個節點所代表的回文串分別是(從\(2\)到\(5\)):\(aa,a,b,aba\)。(這裡這張圖只是增加感性認識,真實構建可能不會出現此形態的自動機。)
因為\(1\)號樹是存長度為奇數的回文串,每次操作又要\(len+=2\),為了減少特判,相信這裡大家也能明白這裡為什麼\(len(1)\)的初值為\(-1\)。
\(fail\)指標:
構建回文自動機:
否則就跳轉到\(fail(last)\),進行上一步的匹配判斷直到走到\(1\)號結點。(回顧一下\(fail\)指標:指向當前節點所表示的回文串的最長回文字尾(不包括自己))
在字典樹中插入該節點。
構建該節點的\(fail\)指標。
2:插入\(b\)
3:插入\(b\)
4:插入\(a\)。
當然此時可以在插入乙個\(a\)試試,會發現需要連\(0-6-a\),\(len(6)=2\),\(fail(6)==2\),\(last=6\)。
成圖:更新\(last\)為當前插入的節點。
強烈建議模擬一遍加深印象。
模板題:洛谷_5496
#includeusing namespace std;
const int maxn = 5e5 + 10;
struct pam_trie
;struct pam
//讀入字串
void read()
//尋找當前
int get_fail(int las, int i)
//新建節點
void ins(int i)
//更新last(上一次插入的節點)
last = b[p].ch[s[i]];
}//這題題目要求第i個位置答案是k,第i+1個位置代表的
//字元就變成了(c-97+k) % 26 + 97
void solve()
}}p;int main()
回文自動機(PAM) 學習筆記
無。強行說和kmp有關也是可以的 1.乙個長度為 n 的字串最多有 n 個本質不同的回文子串。2.對於乙個字串 s,如果在其之後新插入乙個字元,那麼最多產生一種新的回文子串。證明 假設加入這個字元之後得到的最長回文字尾為 t,那麼對於長度小於 t 的任何回文字尾,它們必然在更前面的位置出現過。如圖所...
回文樹(回文自動機) 筆記
回文樹詳解1 what is palindromic auto machine?回文自動機,又叫回文樹,是由俄羅斯人 mikhailrubinchik於2014年夏發明的 這是一種比較新的資料結構,在原文中已有詳細介紹與 實現。回文樹其實不是嚴格的樹形結構,因為它有是兩棵樹,分別是偶數長度的回文樹和...
回文自動機
回文自動機,又叫回文樹,是由俄羅斯人 mikhailrubinchik於2014年夏發明的 這是一種比較新的資料結構,在原文中已有詳細介紹與 實現。回文樹其實不是嚴格的樹形結構,因為它有是兩棵樹,分別是偶數長度的回文樹和奇數長度的回文樹,樹中每個節點代表乙個回文串。為了方便,第一棵樹的根是乙個長度為...