SHOI2011 bzoj2342 雙倍回文

2021-07-16 08:24:31 字數 951 閱讀 9737

description

input

輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。

output

輸出檔案只有一行,即:輸入資料中字串的最長雙倍回文子串的長度,如果雙倍回文子串不存在,則輸出0。

首先由題意可知,只用考慮偶數長的回文串。這樣就不用插入#,直接manacher即可。

其中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...