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 #include2view code3 #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 }
剛開始裝逼用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 表...