P4555 國家集訓隊 最長雙回文串

2022-05-20 20:46:03 字數 881 閱讀 7873

p4555 [國家集訓隊]最長雙回文串

題目大意

求s的最長雙回文子串t,即可將t分為兩部分x,y,(|x|,|y|≥1)且x和y都是回文串

建兩個回文自動機,乙個維護字首,乙個維護字尾

最後掃一遍更新答案

my complete code:

#include#include#include#includeusing namespace std;

typedef long long ll;

const ll maxn=200000;

struct nodetree1[maxn],tree2[maxn];

ll last,nod1,nod2,len,ans;

ll belong1[maxn],belong2[maxn];

char s1[maxn],s2[maxn];

inline void solve1()

last=tree1[last].son[s1[i]];

belong1[i]=tree1[last].len;

}}inline void solve2()

last=tree2[last].son[s2[i]];

belong2[len-i+1]=tree2[last].len;

}}int main()

solve1();

solve2();

for(ll i=1;ians)

ans=belong1[i]+belong2[i+1];

printf("%lld",ans);

return 0;

}/*baacaabbacabb

12*/

P4555 最長雙回文串

t xy 其中 x,y 均為回文串,求 t 的最大長度 首先把每兩個原有字元的間隙填充上其他字元,然後可以用 manacher 求出每個點的最大回文半徑 len i 此時這個回文半徑對應的回文串的實際長度是 len i 1 因為要求的是兩個回文串拼起來,所以可以求 l i,r i 分表表示以 i 開...

國家集訓隊 最長雙回文串

可能還是非常板子的 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 字串...