BZOJ3790 神奇項鍊

2022-02-13 02:25:05 字數 916 閱讀 2781

想要成為我的master嘛?

題目大意:用最少的回文串覆蓋整個字串,可重疊。

題解:manacher+貪心

md最近好幾個線段覆蓋的題都沒看出來。

manacher算出以每個字元為中心的回文串,就是乙個線段,計算出左端點i-len[i]+1和

右端點i+len[i]-1,然後貪心用每個線段覆蓋區間就好了,兩個回文串,就是兩個區間是

可以重疊的。貪心嘛,就是以左端點為第一關鍵字,右端點為第二關鍵字排序。沒次找

能與上一條線段相接的右端點最大的就行了。

**:

#include#include

#include

#include

#define maxn 50009

using

namespace

std;

char s[maxn*2],str[maxn*2

];int len,len[maxn*2

];struct

xxd[maxn*2];

bool

cmp(x a,x b)

void

getstr()

str[k++]='

#';len=k;}

void

manacher()}

intmain()

sort(xd+1,xd+len,cmp);

int ans=1,now=2,r=xd[1

].r;

while(r!=len-1

) r=mx;ans++;

}cout

<1

<}

return0;

}

bzoj3790 神奇項鍊

傳送門 記一下貪心的方法 從左往右掃。每個回文左端點記錄了回文右端點的位置。l as tlast last 記錄上次的最右端。max rmaxr maxr 記錄從i ii往右走到las tlast last 過程中的最右端。初始化las t ma xr t 0 last maxr t 0 last ...

BZOJ 3790 神奇項鍊

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

bzoj3790 神奇項鍊

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