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 字串...