题解

  首先二分一下,花费2次操作求出第一位的字符。

  假设第一个字符是 Y,答案字符串的长度为 i-1 的前缀是 S,我们考虑如何只花费1次询问得到下一个字符。

  press(SAA,SAB,SAX,SB) - (i-1)

  如果是 0 ,那么下一个字符是 X

  如果是 1 ,那么下一个字符是 B

  如果是 2 ,那么下一个字符是 A

  最后一个字符花费 2次操作暴力询问即可。

  这样刚好需要 n+2 次操作。

代码



#include <bits/stdc++.h>
#include "combo.h"
using namespace std;
char c[4]={'A','B','X','Y'};
string guess_sequence(int n){
string ans;
if (press("AB"))
ans=press("A")?"A":"B";
else
ans=press("X")?"X":"Y";
if (n==1)
return ans;
for (int i=0;i<3;i++)
if (c[i]==ans[0]){
swap(c[i],c[3]);
break;
}
for (int i=2;i<n;i++){
int tmp=press(ans+c[0]+c[0]+ans+c[0]+c[1]+ans+c[0]+c[2]+ans+c[1])-(i-1);
ans+=c[2-tmp];
}
if (press(ans+c[0])==n)
ans+=c[0];
else if (press(ans+c[1])==n)
ans+=c[1];
else
ans+=c[2];
return ans;
}