回文自動機刷題總結

2022-03-16 13:57:23 字數 1217 閱讀 7367

假如博主能成功發表這篇博文,那說明博主已經戰勝了冰凍的手和冰凍的鍵盤

這裡仍然只總結一些思路比較好的題或者一些常見的套路

1>

設$trans[i]$代表小於等於$pam$節點$i$的$len$的一半的長度最大的節點

可以從$trans[fa[i]]$跳幾次$fail$求出

2>

建出fail樹,開桶記錄某乙個長度的回文串是否出現過

發現反對稱與回文的差別在於對稱位置相同或者恰好相反

所以便可以改動一下$getfail$的條件

但是會出現0011的情況,第三個位置極力想讓長度大

所以和前兩個形成了的長度為3的串,這是不合法的

所以當長度為奇數的時候應該讓它繼續跳下去

這道題$hzoj$上沒有,所以稍微貼上一下題面:

初始有乙個空串,利用下面的操作構造給定串 s。

1、串開頭或末尾加乙個字元

2、串開頭或末尾加乙個該串的逆串

求最小化運算元。

某kt:"這道題是撒比題!"

我:"..."

這種題顯然是不能貪心的,所以考慮在$pam$上$dp$

由於最終的串一定是由$2$操作暴力進行$1$操作形成的

設$dp[i]$代表到了$i$節點的最小操作次數

不妨求出$trans$陣列,那麼便有轉移$<1>$:

$$dp[i]=min(dp[i],dp[trans[i]]+1+len[i]/2-len[trans[i]])$$

即先暴力補全一半,再進行2操作

但是因為$pam$的$fail$都是當前串的回文字尾

所以無法處理回文串位於複製後串的中間的情況

考慮引入另一種轉移:對於$j$,假如$i$是$j$的孩子

那麼便有轉移$<2>$:

$$dp[i]=min(dp[i],dp[j]+1)$$

即在$j$複製之前加入$i$缺的字元,所以應該是$1$而不是$2$

本題的奇數長度回文串一定是某兩個偶數回文串的中間狀態,

或者從偶回文串到答案串的中間狀態,所以不需要進行$dp$

最後為了保證轉移的有序性,需要$bfs$來$dp$

題面過長,直接上鏈結

兩個串的公共回文串,考慮對兩個串的$pam$同時進行$dfs$

求出的長度便可以更新答案

比較好的乙個思路,值得積累

另外jsoi2013快樂的jyy和這道題的思路基本上是相同的

回文自動機入門題

給你乙個長度為 n 的字串 s,下標從 1 開始 輸出 n 個數,第 i 個數表示 1 i 內有多少個本質不同的回文串 回文自動機入門題 定義 ans i 表示 1 i 共有 ans 個本質不同的回文串 ans ans ural1960.cpp 問題描述 順序和逆序讀起來完全一樣的串叫做回文串。比如...

回文自動機

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

回文自動機

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