A
题意
一个字符串 s s s 的表示 B B B 是一个数组:如果第 i i i 位之前有一位 j j j 与它相同,则 b i b_i bi 为 i i i 与最大的 j j j 的差,否则 b i = 0 b_i=0 bi=0。
按照 B B B 的字典序对给定字符串 s s s 的所有后缀进行排序。
数据范围: 1 ≤ n ≤ 1 0 5 , ∑ n ≤ 1 0 6 1\le n\le 10^5, \sum n\le 10^6 1≤n≤105,∑n≤106,字符集为 { a , b } \{a,b\} {a,b}。
题解
两个串的表示相同当且仅当两个串相同或者将其中一个反转(a->b,b->a)后相同。
所以很容易比较两个后缀的 B B B 的大小,即得到 lcp(S,T),lcp(S,T反转) 后比较后一位 b i b_i bi 的大小。
lcp 使用后缀数组维护,那么比较是 O ( 1 ) O(1) O(1) 的,直接排序即可。时间复杂度 O ( n log n ) O(n\log n) O(nlogn)。
F
题意
定义 x ∞ x^{\infty} x∞ 为无数个串 x x x ⋯ xxx\cdots xxx⋯ 拼起来。
给定两个串 a , b a,b a,b,比较 a ∞ a^{\infty} a∞ 和 b ∞ b^{\infty} b∞ 的字典序。
数据范围: 1 ≤ ∣ a ∣ , ∣ b ∣ ≤ 1 0 5 1\le |a|,|b|\le 10^5 1≤∣a∣,∣b∣≤105, ∑ ∣ a i ∣ + ∣ b i ∣ ≤ 2 × 1 0 6 \sum |a_i|+|b_i|\le 2\times 10^6 ∑∣ai∣+∣bi∣≤2×106。
题解
将 a , b a,b a,b 分别倍长一倍然后比大小即可。
J
题解
之前没学过分部积分法,我哭了。
考虑此式变为
∫
0
1
x
n
(
1
−
x
)
n
d
x
\int_0^1 x^n(1-x)^n dx
∫01xn(1−x)ndx,令
u
=
(
1
−
x
)
n
,
d
v
=
x
n
d
x
u=(1-x)^n, dv=x^ndx
u=(1−x)n,dv=xndx 即
v
=
x
n
+
1
n
+
1
v=\frac{x^{n+1}}{n+1}
v=n+1xn+1,由分部积分法
∫
x
=
0
1
u
d
v
=
u
v
∣
x
=
0
1
−
∫
x
=
0
1
v
d
u
\int_{x=0}^1 udv=uv|_{x=0}^1 - \int_{x=0}^1 vdu
∫x=01udv=uv∣x=01−∫x=01vdu
而
d
u
d
x
=
−
n
(
1
−
x
)
n
−
1
\frac{du}{dx}=-n(1-x)^{n-1}
dxdu=−n(1−x)n−1,所以
∫
x
=
0
1
u
d
v
=
(
1
−
x
)
n
x
n
+
1
n
+
1
∣
x
=
0
1
+
∫
x
=
0
1
x
n
+
1
n
+
1
n
(
1
−
x
)
n
−
1
d
x
=
n
n
+
1
∫
x
=
0
1
x
n
+
1
(
1
−
x
)
n
−
1
d
x
\int_{x=0}^1 udv= \left. (1-x)^n\frac{x^{n+1}}{n+1} \right|_{x=0}^1+ \int_{x=0}^1 \frac{x^{n+1}}{n+1} n(1-x)^{n-1}dx=\frac{n}{n+1}\int_{x=0}^1 x^{n+1}(1-x)^{n-1}dx
∫x=01udv=(1−x)nn+1xn+1∣∣∣∣x=01+∫x=01n+1xn+1n(1−x)n−1dx=n+1n∫x=01xn+1(1−x)n−1dx
这启示我们令
I
i
=
∫
x
=
0
1
x
n
+
i
(
1
−
x
)
n
−
i
d
x
I_i=\int_{x=0}^1 x^{n+i}(1-x)^{n-i}dx
Ii=∫x=01xn+i(1−x)n−idx
仿照上面的分部积分过程可以得到
I
i
=
n
−
i
n
+
i
+
1
I
i
+
1
I_i=\frac{n-i}{n+i+1}I_{i+1}
Ii=n+i+1n−iIi+1
边界为
I
n
−
1
=
1
2
n
(
2
n
+
1
)
I_{n-1}=\frac{1}{2n(2n+1)}
In−1=2n(2n+1)1,所以我们直接得到答案
I
0
=
(
n
!
)
2
(
2
n
+
1
)
!
I_0=\frac{(n!)^2}{(2n+1)!}
I0=(2n+1)!(n!)2