傳送門
輸入長度為n的串s,求s的最長雙回文子串t,即t可分為兩部分x和y且x和y都是回文串。
考慮列舉中間的斷點,所以我們只要記錄以i為開頭的最長回文串和以i為結尾的最長回文串。
通過中心和長度求開頭已經在 這篇 裡面講過了,這裡不再贅述。結尾也只需自己慢漫推一推也可出來。
可是以某個位置為開頭的最長回文串不一定是某個中心的最長回文串的開頭,其實它還有可能是某個中心的最長回文串的一部分。
我們只需令第i個位置的值和第i-1個位置的值-2比較取最大即可。
同理以某個位置為結束的最長回文串也類似。
#include #include#include
using
namespace
std;
const
int n = 200010
;int
n, n0, id, mx;
intp[n];
char
s[n], a[n];
intl[n], r[n], ans;
intmain()
for (int i = 2; i <= n; i++)
for (int i = n - 1; i >= 1; i--)
for (int i = 1; i < n; i++)
cout
}
國家集訓隊 最長雙回文串
可能還是非常板子的 manacher 還是先跑一遍 manacher 處理出來所有的回文半徑 r i 由於我們要找的答案是兩個回文串拼了起來,所以我們考慮列舉中間這個拼接處 所以我們要找到每乙個 i 其左邊能夠到達 i 的和右邊能到達 i 的最大的回文半徑 顯然並不能直接使用 i r i 和 i r...
國家集訓隊 最長雙回文串
題意是 求字串 a b c 且 c 在序列中 a 和 b 都是回文串 運用了回文字串優美的性質 刪掉任意兩個相同的字元仍然回文且長度減2 看到這題之後 我在想 如果把 a 字串的末尾 設為 a 的長度 b 字串的開始 設為 b 的長度 然後 設 a 字串的 右端點 代表的長度為 r i 設 b 字串...
國家集訓隊 最長雙回文串
嘟嘟嘟 這道題,我的大致思想是先用manacher求出所有回文串,然後用剛好拼接在一起的兩個回文串的總長的最大值更新答案。manacher是o n 的,但是暴力的列舉回文中心能達到o n2 所以得想辦法優化列舉。令pre i 表示離 i最遠且左半部分包含 i 的回文串的回文中心的位置,suf i 表...