一个字符串 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)。
定义 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 分别倍长一倍然后比大小即可。
之前没学过分部积分法,我哭了。
考虑此式变为 ∫ 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