hdu 3068 最長回文

2022-08-04 20:39:11 字數 874 閱讀 1008

傳說中的馬拉車演算法233

(先吐槽,manacher我一直覺得打成manachar比較對2333)

manachar的第一步(很神奇的一步),就是把原串每個字元中間再加上乙個原串沒有出現的字元,為什麼這樣搞呢?

自己可以畫乙個圖看一下:2333其實加上直接,原來的回文長度就都是奇數了。

然後有2個變數,mx和id,表示id位置的回文長度最大,到了mx位。還有乙個p陣列,表示每個位置的回文長度。最後的答案就是max-1(不要問為什麼)

那麼這些東西是怎麼work(用高大上的詞彙)的呢?

大概的意思就是利用了回文的性質,用 i 關於 id 的對稱點 j 來更新 i 的答案,當然是在 i然後剩下不知道的再暴力匹配就好。

因為這個東西的mx就正好跑完乙個串,所以複雜度肯定是o(n)的啊233

裸題:

1 #include 2 #include 3 #include 4 #include 5 #include 6

#define ll long long

7using

namespace

std;89

const

int maxn=233333;10

11int len[maxn<<1

];12

char

a[maxn];

1314

int manachar(char *p)

1524 s[l++]='

~'; s[l]=0;25

int mx=0,pos=0,ans=0;26

for (int i=1; i)

2733

return ans-1;34

}3536int

main()

37

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之間由空行...