回文樹(自動機) 練習和總結

2021-08-27 00:12:55 字數 2120 閱讀 6091

回文樹是一種強大的回文字串處理演算法,他的構造過程實際上和kmp多少有些相似,這裡講的很是仔細。

下面摘錄幾個例題。

ural 1960 palindromes and super abilities

每次加乙個新節點,說明了有乙個新的回文串產生。這個感覺真的很重要啊……我們在自動機裡記錄一下就好

ural 2040 palindromes and super abilities 2

和上面的題,讓add函式,返回是不是產生了新的串,出題人卡輸出也是經典

bzoj 3676 回文串

長度乘以次數,次數首先要向父節點更新,為什麼呢。首先子節點是父節點擴充套件來的,子節點擴充套件的相當於是從乙個小的的回文串,新增了字元,變成了大的回文串。說明子串出現的得次數需要向父串傳遞(fail)

hysbz 2160 拉拉隊排練

求出前k長的奇數長度回文子串,對他們的長度求乘積。

所有的意味著我們要把每個節點代表的唯一字串的長度和出現的次數都處理出來,這道題有點卡常……

hdu 5658 ca loves palindromic

這道題資料範圍很小,我們只要把每乙個詢問暴力都處理出來就行,我們讓自動機的add函式返回當前新增過字元後,自動機位置上有的多少個回文串。

hdu 5157 harry and magic string

求出不相交的回文串有多少對

首先,我們反著新增一下,讓add返回當前位置的回文串個數num,順便求乙個字尾和,這樣就相當於處理出了每個位置右邊有多少個回文串,然後我們正著新增一下,這樣左邊的和右邊的乘一下就是答案,求和就ok、

codeforces 17e palisection

處理回文串的前字尾和也是一類經典問題,這道題要我們求出相交的回文串的個數。

我們可以利用上面的辦法,通過所有的回文串對數 - 不相交的對數來求最後的答案,卡記憶體……

hysbz 2565 最長雙回文串

把乙個串劈開,左右兩邊是回文串的最長字串

可以想到列舉分割點,那麼我們建兩個自動機(應該是建兩次,偷了個懶),乙個是正向插入,乙個是反向。這兩個自動機都維護乙個這個回文串能向左延伸的長度。反向的就是向右,然後列舉分割點判斷下就ok

hdu 5421 victor and string

維護乙個可以兩邊都可以新增的回文自動機,那麼我們首先要解決這麼幾個問題:

last指標的位置:我們開兩個變數存,代表兩邊構造到了什麼位置

fail的尋找,由於我們分成了左右,相當於是從中間向左向右找,這個時候就需要乙個輔助變數tot來記錄構造到的位置,方便我們進行尋找。

左右兩邊的影響:在一邊新增實際上會影響到另一邊的指標,我們利用上面的tot變數判斷左右兩邊是不死連在一起。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define pr pair

#define fi first

#define se second

#define mp make_pair

#define ll long long

using

namespace

std;

const

int maxn = 1e5+10 ;

const

int n = 26 ;

struct palindromic_tree

void init ()

int get_fail ( int x ,int k)

int add ( int x ,int k)

return num[last[k]];

}}pam ;

char buf[maxn];

char s[10];

int main()

else

if(op == 2)

else

if(op == 3)

else}}

return

0;}

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

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

回文自動機

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

回文自動機

乙個節點表示乙個回文串。tot 節點個數,即不同回文串的個數。兩棵樹,節點為0,1,所以最後計數時從2開始 n 新增的字元個數 last 新新增乙個字母後所形成的最長回文串表示的節點 nxt i c 節點i表示的回文串在兩邊新增字元c後變成的回文串編號 兒子 cnt i 節點i表示的本質不同的串的個...