【例題
】:
\color
【例題】
: 給出乙個只由小寫英文本元a,b,c...y,z
組成的字串s
ss,求s
ss中最長回文串的長度(見洛谷p3805
)。
【 思路
】:
\color
【思路】
: 我們先考慮暴力演算法:列舉乙個回文中心,然後向兩邊擴充套件。
這樣做有兩個問題:一是需要區分奇數和偶數。比如aba
和abba
,我們肉眼一看就知道兩個都是回文,但是對於偶數回文串而言,它們的回文中心不是乙個可見字元(比如abba
的回文中心在兩個b
之間)。二是時間複雜度太高。列舉的時間複雜度為o(∣
s∣
)o(|s|)
o(∣s∣)
(∣ s∣
|s|∣s
∣表示字串s
ss的長度)。而拓展的時間複雜度最壞為o(∣
s∣
)o(|s|)
o(∣s∣)
,總的時間複雜度為o(∣
s∣2)
o(|s|^2)
o(∣s∣2
)。m an
ache
r演算法(
中文名:
馬拉車算
法)
\color
manach
er演算法
(中文名
:馬拉車
演算法),是解決此問題的o(∣
s∣
)o(|s|)
o(∣s∣)
演算法。首先,為了統一奇偶情況,我們在每個字元之間加上乙個沒有在s
ss**現的字元(比如aba
變成$a$b$a$
)。
記p [i
]p[i]
p[i]
表示以第i
ii個字元為回文中心的最長回文半徑,r
rr為最長回文右邊界,mid
midmi
d為最長回文右邊界中心,i
ii表示當前求解p[i
]p[i]
p[i]
。考慮如何求p
pp陣列,求解有好幾種情況: 【程式碼
】:
\color
【程式碼】
:
const
int n=
11001000
;char s[n]
,s1[n<<1]
;int p[n<<1]
,ans,n;
inline
void
manacher()
}inline
void
calc_answer()
}int
main()
2019 08 18 日常總結
一本通1599 題意 在一年前贏得了小鎮的最佳草坪比賽後,fj 變得很懶,再也沒有修剪過草坪。現在,新一輪的最佳草坪比賽又開始了,fj 希望能夠再次奪冠。然而,fj 的草坪非常髒亂,因此,fj 只能夠讓他的奶牛來完成這項工作。fj 有 nn 只排成一排的奶牛,編號為 11 到 nn。每只奶牛的效率是...
5059日常總結
1.乙個函式的形參是const char 實參是可以是char 如果乙個函式的返回值是const char 不能用char 來接收返回值 2.為什麼沒有靜態的建構函式和析構函式?建構函式成員函式使用現有分配構造指定的物件 即存在this。static成員函式指定物件沒有儲存,因此沒有關聯的例項要構造...
2019 10 01日常總結
前言 今天是祖國母親70歲生日,請允許我向祖國母親說一聲 生日快樂!願您永遠繁榮昌盛 山清水秀!題意 松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n nn個房間,並且有n 1 n 1n 1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在 樹 上。松鼠想邀請...