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#includeview code#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;
}
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之間由空行...