description首先由題意可知,只用考慮偶數長的回文串。這樣就不用插入#,直接manacher即可。input
輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。
output
輸出檔案只有一行,即:輸入資料中字串的最長雙倍回文子串的長度,如果雙倍回文子串不存在,則輸出0。
其中p[i]表示以i和i+1的中點為對稱軸,最大回文串長度的一半。
接下來考慮求解,設答案表示為i..j,k..x,x+1..y,y+1..q,這四段分別為w,wr,w,wr。只考慮x和y,則合法的條件為y-p[y]<=x【後兩段是回文串】且y<=x+p[x]/2【整個是回文串】。
具體做法是先將y按y-p[y]排序,然後掃瞄x,把滿足y-p[y]<=x的y插入set中,在查詢最大的小於等於x+p[x]/2的y更新答案。
整體複雜度o(nlogn)。
#include
#include
#include
#include
using
namespace
std;
int l,p[500010],a[500010];
char s[500010];
set se;
set::iterator it;
bool cmp(const
int &a,const
int &b)
}}void solve()
x=*(--se.upper_bound(i+p[i]/2));
if (x<0) continue;
ans=max(ans,4*(x-i));
}printf("%d\n",ans);
}int main()
雙倍回文 Shoi2011 bzoj2342
time limit 10 sec memory limit 128 mb submit 2820 solved 1088 submit status discuss 輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。輸出檔案只有一行,即 輸入資料中字串...
bzoj 2342 Shoi2011 雙倍回文
題目大意 演算法一 因為雙倍回文串必定是乙個回文串 所以先用manachar求出每個點能夠擴充套件出的最長的回文串長度f i 再列舉對稱軸x,對於y只要滿足y f y x y x f x 2,就可以用len x,y 4來更新答案 對於每個x,只需要用距離其最遠的滿足條件的y來更新即可 將其按i f ...
bzoj2342 Shoi2011 雙倍回文
傳送門 參考題解 一道很好的manacher練手題。一開始把題讀錯了,以為是w1 w 1w 2w 2 形式的就可以,題目哪有這麼簡單 觀察題目,我們可以發現 對於每乙個符合條件的子串,都有j p j i j i,p j 是以j為中心最大的 畫個圖可能更好理解 圖中綠色矩形中就是一種可行方案。所以ma...