BZOJ3790 神奇項鍊

2022-05-12 00:53:41 字數 2760 閱讀 3197

time limit: 10 sec  memory limit: 64 mb

submit: 79  solved: 40

[submit][status]

母親節就要到了,小 h 準備送給她乙個特殊的項鍊。這個項鍊可以看作乙個用小寫字

母組成的字串,每個小寫字母表示一種顏色。為了製作這個項鍊,小 h

購買了兩個機器。第乙個機器可以生成所有形式的回文串,第二個機器可以把兩個回文串連線起來,而且第二個機器還有乙個特殊的性質:假如乙個字串的字尾和

乙個字串的字首是完全相同的,那麼可以將這個重複部分重疊。例如:aba和aca連線起來,可以生成串abaaca或

abaca。現在給出目標項鍊的樣式,詢問你需要使用第二個機器多少次才能生成這個特殊的項鍊。 

輸入資料有多行,每行乙個字串,表示目標項鍊的樣式。 

多行,每行乙個答案表示最少需要使用第二個機器的次數。 

abcdcba

abacada

abcdef 02

5每個測試資料,輸入不超過 5行 

每行的字串長度小於等於 50000

題解:我想呵呵。。。

我是這樣想得,我們先manacher一遍,令f[i]表示打出1--i的最小花費

然後可以o(n)求出以每個點結尾的最長回文子串,不妨設最遠擴充套件到x,

然後就可以用min(f[j])(x-1<=j<=i-1) +1來更新f[i]

就可以線段樹搞了。

**:

1 #include2

3 #include4

5 #include6

7 #include8

9 #include10

11 #include12

13 #include14

15 #include16

17 #include

1819 #include20

21 #include

2223

#define inf 1000000000

2425

#define maxn 500000+5

2627

#define maxm 20000000+5

2829

#define eps 1e-10

3031

#define ll long long

3233

#define pa pair34

35#define for0(i,n) for(int i=0;i<=(n);i++)

3637

#define for1(i,n) for(int i=1;i<=(n);i++)

3839

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

4041

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

4243

#define mod 1000000007

4445

using

namespace

std;

4647 inline int

read()

4849

5455

while(ch>='

0'&&ch<='9')

5657

return x*f;

5859}60

intn,m,a[maxn],f[maxn],p[maxn];

61char

s[maxn];

62struct segt[4*maxn];

63 inline void build(int k,int l,int

r)64

67 build(k<<1,l,mid);build(k<<1|1,mid+1

,r);68}

69 inline void pushup(int

k)70

73 inline void change(int k,int x,int

y)74

77if(x<=mid)change(k<<1,x,y);else change(k<<1|1

,x,y);

78pushup(k);79}

80 inline int query(int k,int x,int

y)81

8889

intmain()

9091

110int now=0

;111 for1(i,n)if(i+p[i]>now)

112116 for1(i,m)change(1,i,query(1,max(0,(f[i<<1]>>1)-1),i-1)+1

);117 printf("

%d\n

",query(1

,m,m));

118 memset(a,0,sizeof

(a));

119 memset(s,0,sizeof

(s));

120 memset(p,0,sizeof

(p));

121 memset(f,0,sizeof

(f));

122}

123124

return0;

125126 }

view code

剛開始裝逼用gets結果wa了好幾發感覺人生無望,這種題都a不了,就頹了一節課t_t

upd:orzky的題解

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 表...