BZOJ3790 神奇項鍊

2022-05-12 14:23:57 字數 736 閱讀 3148

**\(manacher\):

題目傳送門:

問題就是求用多少個回文子串可以覆蓋整個原串。

把回文子串的乙個個區間\([l,r]\)拎出來,按\(l\)為第一關鍵字\(r\)為第二關鍵字從小到大排序。

設\(mx\)是已經掃過的區間\(r\)的最大值。\(tmp\)表示我再接上乙個回文子串可以到達的下乙個\(r\)的最大值。

如果當前區間的\(l>mx\)那麼就令\(mx=tmp\),並且\(ans++\)。然後再用當前區間的\(r\)更新\(tmp\)。

時間複雜度:\(o(nlogn)\)

空間複雜度:\(o(n)\)

**如下:

#include #include #include using namespace std;

const int maxn=1e5+5;

int p[maxn];

char s[maxn];

int n,cnt,ans;

struct range

range(int _l,int _r)

bool operator<(const range &a)const

sort(q+1,q+cnt+1);

int tmp=1;mx=1;

for(int i=1;i<=cnt;i++)

printf("%d\n",ans-1);

} return 0;

}

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,然後貪心用每個線段覆蓋區間就好了,兩個...

BZOJ 3790 神奇項鍊

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