音乐播放器
HMF-have much fun Site
 
文章 标签
16

Powered by Gridea | Theme: Fog
载入天数...
载入时分秒...
总访问量:  |   访问人数:

【题解】AT1976 [ARC058D] 文字列大好きいろはちゃん / Iroha Loves Strings

  热度: loading...

这道题很罕见地题解数达到了通过数的 15\frac{1}{5}

nn 个字符串中选出一些字符串,在不改变相对位置的情况下将其拼接起来,使其长度为 kk 。求字典序最小的方案。

对于每个长度 ii ,求出 rir_i 表示 利用 ri+1r_i+1nn 的字符串能拼出长度为 ii 的最右位置。即取了一些字符串后,想让剩下的字符串能拼出 ii 的最远位置。

这个部分我们用 bitset 求解。设 bitset bib_ibi,j=1b_{i,j}=1表示前 ii 个串拼起来的长度为 jj 时,用后面的串能拼到 kk 。初始值设 bn,k=1b_{n,k}=1,设第 ii 个串的长度为 lil_i ,那么 bi=bi+1(bi+1<<li)b_i=b_{i+1}|(b_{i+1}<<l_i) 。如果 bi,j=0b_{i,j}=0bi+1,j=1b_{i+1,j}=1 ,那么 rj=ir_j=i

考虑设 fif_i 为选取一些串,拼成长度为 ii 的串所能拼出的最小串, gig_i 为选取一些串,拼成长度为 ii 的串所能拼出的最小串的最右位置。

考虑 dp。枚举 ii,枚举一个长度 lenlen ,在 gi+1g_i+1nn 中找出字典序最小的长度为 lenlen 的串,并用此更新 fi+lenf_{i+len}。最后输出 fkf_k 即可。

问题变成了求一个区间内长度相同的串中的最小串。枚举每个长度,对所有这个长度的串倍增 RMQ 预处理即可。

复杂度高,但常数较小,能过。至此本题全部完成。