3790 神奇項鍊

2021-08-19 15:46:03 字數 1079 閱讀 7785

容易發現,處理回文串的時候得到的答案是可以去更新答案的,

即 令 f[

i]f [i

]表示處理前

i i

個最小由幾個回文串構成,

那麼,對於第

i' role="presentation">i

i個位置,他由 [i

−p[i

],n]

[ i−

p[i]

,n

]能更新的就是 前 [1

,i+p

[i]−

1][ 1,

i+p[

i]−1

],

因為前字尾相同能直接放在一起,容易正確性很顯然

然後dp方程用樹狀陣列維護即可。

c++**如下:

#include

#define lowbit(x) (x & -x)

#define rep(i,x,y) for(register int i = x; i <= y; ++ i)

#define repd(i,x,y) for(register int i = x; i >= y; -- i)

using

namespace

std;

typedef

long

long ll;

template

inline

void read(t&x)

while(!isdigit(c));

do while(isdigit(c));

x *= sign;

}const

int n = 2e5+50;

char s[n];

int n,p[n],mx;

int t[n];

inline

void update(int x,int w)

inline

int query(int x)

int main()

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

}return

0;}

3790 神奇項鍊

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

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