题目
思路
假使我知道 n n n ,怎么做?注:以下步骤中字符串长度均为 n n n 。
- 询问 a a a ⋯ a aaa\cdots a aaa⋯a ,便可得到 b b b 的个数。
- 询问 b a a a ⋯ a baaa\cdots a baaa⋯a ,跟第一步比较,便可知道第一个字符。
- 询问 a b a a a ⋯ a abaaa\cdots a abaaa⋯a ,跟第一步比较,便可知道第二个字符。
- 以此类推。
- 询问 a a a ⋯ a b a aaa\cdots aba aaa⋯aba ,跟第一步比较,便可知道第 n − 1 n-1 n−1 个字符。
- 通过 b b b 的个数和前 n − 1 n-1 n−1 个字符,推知第 n n n 个字符。
显然我们用了 n n n 步。一看总步数 n + 2 n+2 n+2 ,两步搞定长度!
- 询问单个 a a a 。
- 询问单个 b b b 。
若二者不同,唯一可能是字符串为 a a a ⋯ a aaa\cdots a aaa⋯a 或 b b b ⋯ b bbb\cdots b bbb⋯b ,两次询问中的较大者为长度,较小者为组成字符;若二者相同,则均为 n − 1 n-1 n−1 。
题目似乎解决了。能更好吗?
看看知道 n n n 之后我们干了什么:求 b b b 的数量。倘若我知道了 a a a 的数量和 b b b 的数量,我们是不是可以再次省掉一步?
这样做:询问 a a a ⋯ a aaa\cdots a aaa⋯a ,这里的长度充分大,比如 300 300 300 。
返回值与 300 300 300 的差一定是 a a a 的个数,因为这么多个 a a a 是不需要被更改的!
同理可求出 b b b 的个数,就只需要用 n + 1 n+1 n+1 步了。
代码
和平鸽。