hdu3068 最長回文 Manacher演算法

2022-05-01 23:30:22 字數 970 閱讀 3788

題目大意:求最長回文串的長度。

解題關鍵:manacher演算法

引用乙個較好的解釋

p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
可以這麼說,這行要是理解了,那麼馬拉車演算法基本上就沒啥問題了,那麼這一行**拆開來看就是

如果mx > i, 則 p[i] = min(p[2 * id - i], mx - i)

否則, p[i] = 1

當 mx - i > p[j] 的時候,以s[j]為中心的回文子串包含在以s[id]為中心的回文子串中,由於 i 和 j 對稱,以s[i]為中心的回文子串必然包含在以s[id]為中心的回文子串中,所以必有 p[i] = p[j],見下圖。

當 p[j] >= mx - i 的時候,以s[j]為中心的回文子串不一定完全包含於以s[id]為中心的回文子串中,但是基於對稱性可知,下圖中兩個綠框所包圍的部分是相同的,也就是說以s[i]為中心的回文子串,其向右至少會擴張到mx的位置,也就是說 p[i] >= mx - i。至於mx之後的部分是否對稱,就只能老老實實去匹配了。

對於 mx <= i 的情況,無法對 p[i]做更多的假設,只能p[i] = 1,然後再去匹配了。

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

char s[110010*2];5

int p[110010*2];6

intmain()

13 s[0]='*'

;14int id=0,maxlen=0;15

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

22 printf("

%d\n

",maxlen-1

);23

}24 }

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