假如博主能成功發表這篇博文,那說明博主已經戰勝了冰凍的手和冰凍的鍵盤
這裡仍然只總結一些思路比較好的題或者一些常見的套路
1>
設$trans[i]$代表小於等於$pam$節點$i$的$len$的一半的長度最大的節點
可以從$trans[fa[i]]$跳幾次$fail$求出
2>
建出fail樹,開桶記錄某乙個長度的回文串是否出現過
發現反對稱與回文的差別在於對稱位置相同或者恰好相反
所以便可以改動一下$getfail$的條件
但是會出現0011的情況,第三個位置極力想讓長度大
所以和前兩個形成了的長度為3的串,這是不合法的
所以當長度為奇數的時候應該讓它繼續跳下去
這道題$hzoj$上沒有,所以稍微貼上一下題面:
初始有乙個空串,利用下面的操作構造給定串 s。某kt:"這道題是撒比題!"1、串開頭或末尾加乙個字元
2、串開頭或末尾加乙個該串的逆串
求最小化運算元。
我:"..."
這種題顯然是不能貪心的,所以考慮在$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表示的本質不同的串的個...