loading

UOJ616 JOISC2021 古老的机器

题意

通信题。

有两个人 A 和 B,B 手上有一个看不见内容的字符串,A 能看见这个字符串的内容,字符集为 X,Y,Z。A 负责把信息传输给 B,B 负责删除字符串。定义一次好的删除是指某一次删除了 \(y\) 满足删除前存在 \(x<y<z\) 使得 \((x,y),(y,z)\) 全被删光,且 \(x\) 上为 X\(y\) 上为 Y\(z\) 上为 Z。B 需要保证他的删除顺序中好的删除次数尽可能多。A 可以给 B 传输若干个 01,按照传输 01 数量给分。满分要求 \(7\times10^4\),有分要求 \(2\times10^5\)

\(n\le 10^5\)

分析

不难发现两个基本事实:

  1. 第一个 X 和最后一个 Z 之外的所有位置没有用。
  2. 由相同字符组成的一个连续段只有一个有用。

忽略第一个 X 和最后一个 Z 之外的所有字符,考虑第一个 X 和第一个 Z 连续段,不难发现这之间只会出现 X 和 Y。考虑到 Z 是一个连续段,先以任意顺序将 Z 删的只剩一个,然后一路往前删即可,不难发现每个 Y 连续段左面一定会存在一个 X,所以一定存在贡献。并且注意到如果我们保留 Z 连续段的最后一个 Z,那么我们只需要从这个 Z 开始往前删即可。这个做法只需要得知第一个 X 和每个 Z 连续段的末尾位置即可。需要 \(10^5\) 个 bit。

考虑优化,考虑到因为是连续段所以存的位置之间必然有空格,而有效状态是 fibonacci 数(根据 DP 递推式容易得到),所以可以压缩。但是这个数字仍然很大,没法快速计算出传的串,考虑分块,将要传的信息分成若干个块,然后内部把有效状态压缩,这里可以通过传过去串的字典序排名实现。假设块长为 \(B\),那么总代价就是 \(\lceil\dfrac{n}{B}\rceil\times \log_2F_B\),其中 \(F_B\) 为长度为 \(B\) 的有效状态数,枚举一下发现(在 \(F_B\) 在 long long 范围内的前提下)取 \(B=76\) 最优,代价是 \(69748\)(好像是这个数),每一块要传的信息长度是 \(K=53\),然后在算上 X 的位置消耗 \(16\) 个位,然后就过了。

posted @ 2025-07-10 16:05  dcytrl  阅读(18)  评论(0)    收藏  举报