BZOJ 3790 神奇項鍊

2022-04-30 04:36:08 字數 1095 閱讀 2852

【演算法】(manacher+貪心)||(manacher+dp+樹狀陣列/線段樹)

【題解】

manacher求回文串,後得到線段,做一點計算對映回原串線段。

然後問題轉化為可重疊區間線段覆蓋問題,可以貪心解決。

排序左端點,同一左端點取最長段,然後在此段中找到右端點最靠右的線段,線性更新並累加。

dp的話:f[i]表示剛好覆蓋1...i的最少線段(即最後一條線段右端點在i上),則按順序列舉線段a[i],

f[a[i].r]=min(f[j])+1 , j=(a[i].l,a[i].l+1,...,a[i].r-1),顯然a[n]為答案。

兩者複雜度皆為o(n log n)。

#include#include

#include

using

namespace

std;

const

int maxn=200010

;int

n,p[maxn];

char

s[maxn],ss[maxn];

struct cyca[maxn];

bool

cmp(cyc a,cyc b)

void

manacher()

//printf("p[%d]=%d\n",i,p[i]);

if(i%2)a[i].l=i/2-p[i]/2+1,a[i].r=i/2+p[i]/2

;

else a[i].l=i/2-p[i]/2+1,a[i].r=i/2+p[i]/2-1

;

if(a[i].l>a[i].r)a[i].l=a[i].r=1

; }

//for(int i=1;i<=n;i++)printf("%d %d\n",a[i].l,a[i].r);

}int

main()

if(right;

printf(

"%d\n

",ans-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 ...

BZOJ3790 神奇項鍊

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

bzoj3790 神奇項鍊

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