2020牛客暑期多校训练营(第一场)

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 1n105,n106,字符集为 { 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 1a,b105 ∑ ∣ a i ∣ + ∣ b i ∣ ≤ 2 × 1 0 6 \sum |a_i|+|b_i|\le 2\times 10^6 ai+bi2×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(1x)ndx,令 u = ( 1 − x ) n , d v = x n d x u=(1-x)^n, dv=x^ndx u=(1x)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=uvx=01x=01vdu
d u d x = − n ( 1 − x ) n − 1 \frac{du}{dx}=-n(1-x)^{n-1} dxdu=n(1x)n1,所以
∫ 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=(1x)nn+1xn+1x=01+x=01n+1xn+1n(1x)n1dx=n+1nx=01xn+1(1x)n1dx
这启示我们令
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(1x)nidx
仿照上面的分部积分过程可以得到
I i = n − i n + i + 1 I i + 1 I_i=\frac{n-i}{n+i+1}I_{i+1} Ii=n+i+1niIi+1
边界为 I n − 1 = 1 2 n ( 2 n + 1 ) I_{n-1}=\frac{1}{2n(2n+1)} In1=2n(2n+1)1,所以我们直接得到答案
I 0 = ( n ! ) 2 ( 2 n + 1 ) ! I_0=\frac{(n!)^2}{(2n+1)!} I0=(2n+1)!(n!)2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值