bzoj2342 Shoi2011 雙倍回文

2021-08-02 16:42:32 字數 969 閱讀 3119

傳送門

參考題解

一道很好的manacher練手題。。

一開始把題讀錯了,以為是w1

w′1w

2w′2

形式的就可以,題目哪有這麼簡單

觀察題目,我們可以發現:對於每乙個符合條件的子串,都有j+p[j]>=i , j < i,p[j]是以j為中心最大的

畫個圖可能更好理解

圖中綠色矩形中就是一種可行方案。

所以manacher計算以每個字元為中心的回文半徑,然後列舉i和j

//據說時限10s暴力能跑過,然而並沒有意義

我們可以用並查集維護當前可行的j,每次往後跳find(j),直到符合要求或者沒有可行方案

原理:如果某乙個j已經無法覆蓋當前的i,那麼對於後面的i來說這個j也毫無意義

這樣時間複雜度就非常優美了

code:

#include

char a[1000010];

int p[1000010];

int f[1000010];

int n,len,ans,pos,mx;

inline

int max(const

int &a,const

int &b)

inline

int min(const

int &a,const

int &b)

int main()

for(int i=1;i<=len;i++)

if(a[i]=='#') f[i]=i;

else f[i]=i+1;

for(int i=3;i<=len;i+=2)

printf("%d",ans);

return

0;}

雙倍回文 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 ...

SHOI2011 bzoj2342 雙倍回文

description input 輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。output 輸出檔案只有一行,即 輸入資料中字串的最長雙倍回文子串的長度,如果雙倍回文子串不存在,則輸出0。首先由題意可知,只用考慮偶數長的回文串。這樣就不用插入 直...