PAM 學習筆記

2022-05-06 23:33:11 字數 1045 閱讀 2847

回文自動機又叫回文樹,縮寫 pam。它可以處理和回文子串有關的問題。在 pam 上,乙個點儲存的是乙個回文子串

構造 pam 時,我們採取了增量轉移的方式。簡單地說,就是把字串 \(s\) 從左往右掃一遍,每加入乙個新的字元 \(c\) 就更新至多乙個節點(也可能不更新)。

假設當前處理第 \(i\) 個字元。令指標 \(\text\) 表示第 \(i-1\) 個字元處理時最後停在哪個節點上,這個節點同時代表著結尾為前 \(i-1\) 個字元的最長回文字尾。

可以證明,每增加乙個字元 \(c\),至多只會增加乙個本質不同的回文串。

於是我們讓 \(\text\) 沿著 \(\text\) 跳,直到碰到乙個回文字尾 \(p\) 滿足其開頭 \(-1\) 的位置等於這個 \(i\) 的位置,此時從開頭 \(-1\) 的位置到 \(i\) 的位置構成了以 \(i\) 結尾的最長回文字尾。

如果這個以 \(i\) 結尾的最長回文字尾還沒有出現過,我們就新建乙個,在程式裡體現為 \(\text\)。否則就不用。最後再把 \(\text\) 指向 \(\text\)。

至於求 \(\text\) 和上一步類似。我們只需要再找到這樣乙個回文字尾 \(p\) 的基礎上,令 \(p=\text\),依然是跳到滿足「回文字尾 \(p\) 開頭 \(-1\) 的位置等於這個 \(i\) 的位置」時停下。

我們建兩棵樹,將 \(len\) 為奇數和 \(len\) 為偶數的結點分開。定義奇根為 \(1\),偶根為 \(0\)。

char s[maxn];

int n, ans, num[maxn], len[maxn], fail[maxn], tr[maxn][27], last, tot;

void insert(int ch, int i)

last = tr[p][ch];

}void init()

int main()

return 0;

}

以上程式為 luogu 上的模板題 :p5496 [模板] 回文自動機 (pam)。

PAM 學習筆記

插入式驗證模組 pluggable authentication module,pam 是一套共享函式庫api,允許系統管理員來決定應用程式如何識別使用者.注意,應用程式 服務 必須本身是支援pam認證的,也就是說原始碼裡面使用了pam的api pam的體現結構如下圖 認證模組 位於 lib sec...

學習筆記 Manacher與PAM

挺短,背是挺好背的 manacher用於求回文串長度。思想大概就是 1 加入字符集之外的識別字元 比如 分隔開原來相鄰的字母,這樣所有的回文串都變成了以某個字元為中心的 否則如果是偶數長度的回文串還要特判 2 考慮藉由以前的資訊求出新的回文串長度。記錄到現在為止最靠右的回文串中最右側的字元下標 其對...

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

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