容易發現,處理回文串的時候得到的答案是可以去更新答案的,
即 令 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,然後貪心用每個線段覆蓋區間就好了,兩個...