#243. [CFCOI Collection 2] Guessing Binary String

[CFCOI Collection 2] Guessing Binary String

版权声明

本题版权归 所有。

题目来源:https://www.luogu.com.cn/problem/T715247

题目在导入时有改动。

本题的时间限制为 10 秒。

题目描述

对于一个长度为 nn 的 01 串 SS 和一个各项均在 {1,2,,n}\{1, 2, \ldots, n\} 中取值的序列 QQ,定义 f(S,Q)=f(S, Q) =

  • 升序枚举 i=1,2,,mi = 1, 2, \ldots, m,其中 mmQQ 的长度:
    • SS 的第 QiQ_i 位取反,00 变成 1111 变成 00
  • 定义 f(S,Q)f(S, Q) 等于枚举结束后的 01 串 SS

交互库有一个长度为 n (1n20)n\ (1 \le n \le 20) 的 01 串 SS

在交互开始前,你可以得到 nn 的值。

你有 nn 次交互机会。对于每次交互,你可以指定一个 01 串 TT,并得到满足 f(S,Q)=Tf(S, Q) = T 且最短的序列 QQ 的数量。

请利用这 nn 次交互机会求出 SS

你需要在单个测试点中解决 T=2212T = 2^{21} - 2 组数据。

交互方式

本题是交互题。

本题提供额外头文件 "binary.h",你需要使用它进行交互:

函数 描述 限制 可调用次数\\(每组数据)
int init(); 它返回 TT 的值,\\表示数据组数。 不限
int start(); 它返回 nn 的值。
void reject(); 如果你认为问题\\不可能解决,请在\\调用 interact()\\前调用它。 你必须在调用后\\结束本组数据的交互。
long long\\interact\\(string T); 它返回满足f(S,Q)=T\\f(S, Q) = T\\且最短的序列Q\\Q 的数量。 你必须保证 TT\\是长度为 nn 的 01 串。 nn
void stop\\(string S); 你需要传入\\ 01 串 SS 的值。 你必须在调用后\\结束本组数据的交互。 11

请在以下模板上答题。

#include <bits/stdc++.h>
#include "binary.h"
using namespace std;
int main()
{
	int T = init(); // // 得到 T 的值
	while (T--) // T 组数据
	{
		int n = start(); // 得到 n 的值
		if (...) // 如果无解
		{
			reject();
			continue;
		}
		// 否则,有解
		string S = ""; // 答案
		for (int i = 1; i <= n; i++)
			S += "0";
		// 在此处利用 interact 进行交互
		stop(S); // 提交答案
	}
	return 0;
}

样例

请注意,该样例的 T\bm T 不满足数据范围,因此不会出现在测试数据中。

在下面的样例中:

  • T=3T = 3
  • 对于第 1 组数据,n=1n = 1S=0S = \texttt{0}
  • 对于第 2 组数据,n=2n = 2S=10S = \texttt{10}
  • 对于第 3 组数据,n=6n = 6S=111000S = \texttt{111000}

以下的交互过程可以获得 AC。

调用函数 返回值 解释
init(); 22 T=3T = 3
start(); 11 第 1 组数据开始,n=1n = 1
reject(); // 此时任何询问都返回 11\\(无论 SS 是什么),因此无解。
start(); 22 第 2 组数据开始,n=2n = 2
reject(); // 可以证明此时依然无解。
start(); 66 第 3 组数据开始,n=6n = 6
interact("111000"); 11 这个序列是空序列。
interact("101010"); 22 这两个序列是 [2,5][2, 5][5,2][5, 2]
interact("111111"); 66 限于篇幅,不予解释。
interact("000111"); 720720
interact("010101"); 2424
interact("000000"); 66
stop("111000"); // 提交的答案为 111000\texttt{111000},答案正确。