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

2022-03-31 14:43:56 字數 1118 閱讀 4604

無。(強行說和kmp有關也是可以的……)

1. 乙個長度為 n 的字串最多有 n 個本質不同的回文子串。

2. 對於乙個字串 s,如果在其之後新插入乙個字元,那麼最多產生一種新的回文子串。

證明:假設加入這個字元之後得到的最長回文字尾為 t,那麼對於長度小於 t 的任何回文字尾,它們必然在更前面的位置出現過。如圖所示:

所以只有 t 可能是新的回文子串。

記 len[x] 表示節點 x 代表的回文串長度,設 fail[x] 表示「代表節點 x 所代表的回文串的最長回文字尾的節點」。(注意這裡的最長回文字尾是指長度小於原串的最長回文字尾,和後面提到的意義有差別)

設 next[x][c] 表示節點 x 所代表的字串在前後都加上乙個字元 c 之後所到達的狀態。則必然有 len[x] + 2 = len[next[x][c]] 。

首先,我們建兩個節點 a 和 b 。設 len[a] = -1, len[b] = 0 。

於是長度為 1 的回文串就可以有 a 走轉移邊到達。

接下來考慮如何構建 pam 。

考慮增量法,在串 s 後面加入乙個字元 c 後, pam 變成了怎樣?

假設當前插入的字元是 s[i],字串 s 的第 k 個字元為 s[k] 。

設 x 表示 s 的最長回文字尾,那麼如果 s[i - len[x] - 1] = s[i] ,那麼最長回文字尾就是 next[x][s[i]];否則不斷使 x = fail[x] ,直到滿足條件就找到了 s 的最長回文字尾。

找到之後,如果 next[x][s[i]] 這個節點已經存在,那麼什麼也不用幹;否則,我們新建乙個節點代表 next[x][s[i]] , len[next[x][s[i]]] = len[x] + 2 ,那麼如何求 fail[next[x][s[i]]] ?

考慮找到使 x = fail[x] ,末尾加入字元 s[i] 之後,再找一次最長回文字尾即可。

namespace pam

void build(char *s,int n)

x=y;}}

}}

回文自動機學習筆記

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

P5496 模板 回文自動機(PAM)

題目背景 模板題,無背景 其實是我想不出背景 題目描述 給定乙個字串 s。保證每個字元為小寫字母。對於 s 的每個位置,請求出以該位置結尾的回文子串個數。這個字串被進行了加密,除了第乙個字元,其他字元都需要通過上乙個位置的答案來解密。具體地,若第 ii i 1 個位置的答案是 k,第 i 1 個字元...

回文樹(回文自動機) 筆記

回文樹詳解1 what is palindromic auto machine?回文自動機,又叫回文樹,是由俄羅斯人 mikhailrubinchik於2014年夏發明的 這是一種比較新的資料結構,在原文中已有詳細介紹與 實現。回文樹其實不是嚴格的樹形結構,因為它有是兩棵樹,分別是偶數長度的回文樹和...