hdu 3068 最長回文 manacher

2022-05-06 11:42:13 字數 1569 閱讀 3590

好的講解manacher演算法的文章,**並茂。

題意:求給定串的最長回文子串(

2009

多校題目)

分析:列舉每個點向左向右擴充套件,看最遠能擴充套件到哪兒

.但是普通的列舉是

n^2的,肯定超時。現在我們想

kmp或擴充套件

kmp一樣,給字串定義乙個

nex陣列,

nex[i]

表示以i

為中心最遠能向右擴充套件的長度,使得

s[i – nex[i] + 1……. i + nex[i]- 1]

形成的回文。然後我們利用這個陣列,在

o(n)

的時間內求出每個i的

nex[i]

。在其他演算法中,奇數回文和偶數回文經常給我們帶來麻煩,這個演算法中,我們第一步要進行的是將每個字元後邊(包括開頭)加入乙個字元(不在串兒的字符集中就行),一般用

』#」.

這樣就都轉換為了奇數的情況。例如:

abba

(偶)改為 #a#b#b#a# (

最長為以第3個

#為中心

) aba 

(奇)改為

#a#b#a# (

最長為以

b為中心

)剩下的就是在我們知道了

nex[0]…….nex[i – 1]

後如何求

nex[i];p

記錄前i-1

個字元中以某個字元

id為中心最遠能向右擴充套件到的位置。

//

file name: 3068.cpp

//author: zlbing

//created time: 2013/5/9 13:30:20

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define cl(x,v); memset(x,v,sizeof(x));

#define inf 0x3f3f3f3f

#define ll long long

#define rep(i,r,n) for(int i=r;i<=n;i++)

#define rrep(i,n,r) for(int i=n;i>=r;i--)

const

int maxn=2e5;

char str[maxn],str1[maxn*2

];int n,ans,nxt[maxn*2

];void

manacher()

}}void

pre()

str1[k++]='#'

; str1[k]='\0'

; n=k;

}int

main()

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