hdu3068 最長回文 manacher演算法

2022-05-20 08:27:28 字數 890 閱讀 7001

gdkoi時看了一下manacher,發現太弱看不懂……

如今4個月過去了,終於回想起這遺漏的演算法,趕緊回來學了。

這道題是manacher裸題,其實只要理解了並不難。

網上有很多部落格都寫了該演算法的原理,這裡就不展開了。

說幾個要注意的地方:

1.s陣列要開大!(我才不會告訴你我第一次就是因為沒開兩倍re了呢),因為我們要插入字元(一般是『#』),所以至少要開2*len+2這麼大的陣列。

2.讀進來的陣列長為len,那麼我們知道s[len]='\0'。請注意,這裡在插入字元時也要從len開始(即s[len*2+1]='#',s[len*2+2]='\0'),這樣可以防止多組資料導致越界。

3.在從i開始向左右兩邊對比字元後,記得更新最右端的位置(即p[pos]+pos也就是改變對稱軸pos)。

4.最後答案mx記得減一

好了就注意這麼多,具體細節照慣例看**。

#include#include

#include

const

int maxn=220010

;using

namespace

std;

char

s[maxn];

intlen,pos;

intp[maxn];

intmain()

s[0]='$'

;

for(int i=2;i2+1;i++)

printf(

"%d\n

",mx-1

); }

return0;

}

view code

HDU 3068 最長回文

題 目 鏈 接 看完後自己寫了一遍,感覺真的是很神奇的結論啊!本來這題看到可以用字尾陣列來寫的,但沒有學過,去看了一下,真心給暈了,決定找個機會認真研究下。我的 include include includeusing namespace std define min a,b a b a b cha...

HDU 3068 最長回文

存在o n 的演算法,學習了一下 include include includeusing namespace std const int maxn 300011 int n,p maxn char str maxn in maxn int main str 0 str 1 n n 2 2 str ...

HDU 3068 最長回文

problem description 給出乙個只由小寫英文本元a,b,c.y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 input 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c.y,z組成的字串s 兩組case之間由空行...