(一)基於st的rmq
#include#include
#include
using
namespace
std;
const
intmaxn
=100005
; intdp[
maxn
][20],a
[maxn],n
,m; //s陣列下標從0開始
void
init_rmq
()
intrmq(
intl
,intr)
void
init_rmq_index
()
intrmq_index
(intl,
intr
)
intmain
()
}
return0;
}
(二)基於線段樹的rmq
#include#include
#include
#define
lson l,m
,rt<<
1 #define
rson m+1
,r,rt
<<1|
1 using
namespace
std;
const
intmaxn
=100005
; inta[
maxn
],min
[maxn
<<2],
n;void
pushup
(intrt)
void
build
(intl,
intr
,intrt)
intm=(l
+r)>>1;
build
(lson
); build
(rson
);
pushup(rt
); }
intquery
(intl,
intr
,intl,
intr
,intrt)
intmain
()
}
return0;
}
(三) 最長回文 hdu3068
模型:給出乙個只由小寫英文本元a,b,c...y,z組成的字串s,求s中最長回文串的長度.
1.字尾陣列解法
#define
ll long
long
#define
lson l,m
,rt<<
1
#define
rson m+1
,r,rt
<<1|
1
using
namespace
std;
const
intmaxn
=400005
,maxe
=100005
,inf=1
<<
29;
intn,
m,k;
int
rank
[maxn
],tmp
[maxn
],sa
[maxn
],height
[maxn
];
chars[
maxn
],s1
[maxn
];
intdp[
maxn
][30
];
bool
cmp(
inti
,int
j)
}
void
get_sa
()
for(k=
1;k<=n;
k*=2)
}
void
get_lcp
()
}
void
initrmq
()
int
rmq(
intl
,int
r)
int
main
()
for(
inti=1
;ii++)
printf
("%d\n"
,ans
);
}
return
0;
}
//abracadabra
2.manacher演算法
#include
#include
using
namespace
std;
const
intmaxn
=400005
;
chars[
maxn
],str
[maxn
];
intp[
maxn
];
void
init
()
int
manacher
()
return
ans-
1;
}
int
main
()
return
0;
}
資料結構 二 RMQ 區間最值查詢
rmq 和普通陣列的區別是 rmq 是二維陣列,維度為 其中 rmq i j rmq i j rmq i j 表示的是從 a i a i a i 開始長度為 2 j2 j 2j的區間的最小值,那麼顯然,它的初始化可以遞迴進行,且複雜度為 o n logn o nlogn o nlog n 當要查詢 ...
RMQ 區間最值 模板
rmq 的全稱為range max min query。構造dp陣列的時間為o nlogn 但是查詢時間為o 1 所以當資料量小於logn時,用樸素遍歷找最值就好,但是請求次數大於logn時,就要用這個模板。利用動態規劃的思想。int order maxn 使每乙個2 order i i 2 ord...
區間最值的優秀資料結構 ST表
st表,聽起來高大上,實際上限制非常多,僅僅可以求最值問題 為什麼?先從原理看起 st表運用了倍增的思想 st i j min st i j 1 st i 2 j 1 j 1 意義是 從i開始向後連續2 j個位置的最大值是,i開始向後連續2 j 1 個位置的最大值和i 2 j 1 開始向後連續2 j...