bzoj3790 神奇項鍊

2021-09-25 06:51:41 字數 913 閱讀 7401

傳送門

記一下貪心的方法:從左往右掃。每個回文左端點記錄了回文右端點的位置。

l as

tlast

last

記錄上次的最右端。max

rmaxr

maxr

記錄從i

ii往右走到las

tlast

last

過程中的最右端。

初始化las

t=ma

xr=t

[0

]last=maxr=t[0]

last=m

axr=

t[0]

,m ax

rmaxr

maxr

會在移動的過程中不斷更新。

當i

ii越過las

tlast

last

時,表示已經跨過覆蓋的最大範圍了。ans+=1,記錄跨過的這個回文串。

然而最後乙個串的右端點一定在整個串的右端點。跨過了之後退出迴圈。ans記錄不到。

所以整個串覆蓋至少需要(ans+1)個回文串。需要連線ans次。

#include

using

namespace std;

const

int maxn=

1e5+10;

char s[maxn]

;int r[maxn]

,n,t[maxn]

,now,to,ans=

0,last,maxr;

inline

void

manacher()

}int

main()

printf

("%d\n"

,ans);}

}

BZOJ3790 神奇項鍊

想要成為我的master嘛?題目大意 用最少的回文串覆蓋整個字串,可重疊。題解 manacher 貪心 md最近好幾個線段覆蓋的題都沒看出來。manacher算出以每個字元為中心的回文串,就是乙個線段,計算出左端點i len i 1和 右端點i len i 1,然後貪心用每個線段覆蓋區間就好了,兩個...

BZOJ 3790 神奇項鍊

演算法 manacher 貪心 manacher dp 樹狀陣列 線段樹 題解 manacher求回文串,後得到線段,做一點計算對映回原串線段。然後問題轉化為可重疊區間線段覆蓋問題,可以貪心解決。排序左端點,同一左端點取最長段,然後在此段中找到右端點最靠右的線段,線性更新並累加。dp的話 f i 表...

bzoj3790 神奇項鍊

母親節就要到了,小 h 準備送給她乙個特殊的項鍊。這個項鍊可以看作乙個用小寫字 母組成的字串,每個小寫字母表示一種顏色。為了製作這個項鍊,小 h 購買了兩個機器。第乙個機器可以生成所有形式的回文串,第二個機器可以把兩個回文串連線起來,而且第二個機器還有乙個特殊的性質 假如乙個字串的字尾和乙個字串的字...