[CF1282D]Enchanted Artifact

38 篇文章 0 订阅
10 篇文章 0 订阅

题目

传送门 to luogu

思路

假使我知道 n n n ,怎么做?注:以下步骤中字符串长度均为 n n n

  1. 询问 a a a ⋯ a aaa\cdots a aaaa ,便可得到 b b b 的个数。
  2. 询问 b a a a ⋯ a baaa\cdots a baaaa ,跟第一步比较,便可知道第一个字符。
  3. 询问 a b a a a ⋯ a abaaa\cdots a abaaaa ,跟第一步比较,便可知道第二个字符。
  4. 以此类推。
  5. 询问 a a a ⋯ a b a aaa\cdots aba aaaaba ,跟第一步比较,便可知道第 n − 1 n-1 n1 个字符。
  6. 通过 b b b 的个数和前 n − 1 n-1 n1 个字符,推知第 n n n 个字符。

显然我们用了 n n n 步。一看总步数 n + 2 n+2 n+2 ,两步搞定长度!

  1. 询问单个 a a a
  2. 询问单个 b b b

若二者不同,唯一可能是字符串为 a a a ⋯ a aaa\cdots a aaaa b b b ⋯ b bbb\cdots b bbbb ,两次询问中的较大者为长度,较小者为组成字符;若二者相同,则均为 n − 1 n-1 n1

题目似乎解决了。能更好吗?

看看知道 n n n 之后我们干了什么:求 b b b 的数量。倘若我知道了 a a a 的数量和 b b b 的数量,我们是不是可以再次省掉一步?

这样做:询问 a a a ⋯ a aaa\cdots a aaaa ,这里的长度充分大,比如 300 300 300

返回值与 300 300 300 的差一定是 a a a 的个数,因为这么多个 a a a 是不需要被更改的!

同理可求出 b b b 的个数,就只需要用 n + 1 n+1 n+1 步了。

代码

和平鸽。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值