#326. [R52E]RECAL

[R52E]RECAL

时空限制

1S/512M

题目描述

这是一道交互题。

注意:本题并不是排列游戏(perm)。

虽然这同样是一道交互题,同样也是在猜排列,但是它真的不是排列游戏。

交互器内部隐藏着一个长度为 nn 的未知排列 PP(即 1n1 \sim n 的每个整数在 PP 中恰好出现一次)。

你可以通过给出 0101 串来进行查询以推断出该排列。在每一次查询中,你需要向交互器输出一个长度为 nn0101 字符串 ss

交互器读取 ss 之后会向你返回一个同样长度为 nn0101 字符串 tt。其中返回的字符串 tt 满足:

t[i]=s[P[i]]t[i] = s[P[i]]

注:此处的字符串下标从 11 开始计数。

你需要在不超过 1717 次询问内求出这个隐藏的排列 PP

格式

交互格式

首先,你的程序需要从标准输入中读取一个正整数 nn,表示排列的长度。

接下来,你可以发起最多 1717 次询问。对于每次询问:

  • 你需要向标准输出打印 ? s(其中 ss 是一个长度为 nn 的且仅包含 01 的字符串),并刷新缓冲区。(例如 C++ 中的 cout << endl;fflush(stdout);

  • 随后,你的程序需要从标准输入读取一个长度为 nn0101 字符串 tt,这就是交互器返回给你的结果。

当你确定了隐藏的排列 PP 后,你需要按如下格式输出答案:

  • 向标准输出打印 ! P[1] P[2] ... P[n](各个元素之间用空格分隔),并刷新缓冲区,随后正常结束程序。

注意:

  • 在每次输出后,请务必打印换行符并刷新标准输出缓冲区。否则,可能会被判为 TLE(超时)。
  • 如果你的输出格式不正确或程序异常提前终止,判定结果将是不确定的。
  • 在输出答案后,请立即终止程序。否则,判定结果将是不确定的。

样例

样例输入/输出 #1

以下是一个交互的示例。在这个例子中,隐藏的排列为 n=4,P=[3,1,4,2]n = 4, P = [3, 1, 4, 2]

你的程序输出(标准输出) 交互器返回(标准输入) 解释
4 读取到排列长度 n=4n=4
? 1001 询问 s=1001s = 1001
0110 t1=s3=0,t2=s1=1t_1=s_3=0, t_2=s_1=1
t3=s4=1,t4=s2=0t_3=s_4=1, t_4=s_2=0
? 1010 询问 s=1010s = 1010
1100 t1=s3=1,t2=s1=1t_1=s_3=1, t_2=s_1=1
t3=s4=0,t4=s2=0t_3=s_4=0, t_4=s_2=0
? 0001 询问 s=0001s = 0001
0010 t1=s3=0,t2=s1=0t_1=s_3=0, t_2=s_1=0
t3=s4=1,t4=s2=0t_3=s_4=1, t_4=s_2=0
! 3 1 4 2 成功得到结果并输出。

数据规模

注意:你只有通过了子任务的所有测试点,才能获得对应子任务的分数。

子任务编号 分数 nn \le
11 3030 1515
22 7070 10510^5

对于 100%100\% 的数据,1n1051 \le n \le 10^5。每次测试中,排列 PP 在交互开始前就已经固定,交互器不是自适应的