#P7047. 「MCOI-03」数据

「MCOI-03」数据

题目背景

Rin 正在给 MCOI Round 998244353 的题目出数据。

但是她太菜了,把数据生成器写出锅了,于是数据只生成了一半然后生成器就 RE 了。

现在她想请你用这一半的数据恢复出完整的数据。

题目描述

以下是一些常见的定义,如果你很熟悉它们你也可以不看。

01 串是指仅包含 01 两种字符的字符串,仅包含其中一种也是可以的。

一个字符串取出其连续的一段称为子串。容易发现一个长度为 2n2n 的字符串有 n+1n+1 个长度为 nn 的子串。

一组实数 AA 的平均值 A=xAxA\overline{A}=\frac{\sum_{x\in A}x}{|A|},即所有元素的和除以元素的个数。

在此基础上,AA 的方差 S2=xA(xA)2AS^2=\frac{\sum_{x\in A}(x-\overline{A})^2}{|A|},即所有元素与平均值的差的平方和除以元素的个数。

一个长度为 nn 的 01 串 SS 的二进制值等于 i=1nSi2ni\sum_{i=1}^nS_i2^{n-i},其中 SiS_iSS 从左向右第 ii 个字符上的数字。

在本题中,给出如下定义:

一组数据是一个长度为 2n2n 的 01 串。

一组数据的毒瘤度定义为,其所有长度为 nn 的子串的二进制值的方差。

现在,给定一组数据的前 nn 个字符。你需要找到使得这组数据的毒瘤度 最小 的后 nn 个字符。如果有多解,请按照这后 nn 个字符构成的子串的二进制值从小到大排序输出。

输入格式

输入数据共一行,包含一个长度为 nn 的 01 串,表示一组数据的前 nn 个字符。

输出格式

输出若干行,每一行一个长度为 nn 的 01 串,表示一组毒瘤度最小的数据的后 nn 个字符,按照其二进制值从小到大排序输出。

10
10

提示

样例一解释

在本例中 n=2n=2,存在四组满足要求的数据分别是 1000100110101011

1010 有三个长度为 22 的子串,分别为 100110。它们的二进制值分别为 2,1,22,1,22,1,2{2,1,2} 的平均值为 53\frac{5}{3},方差为 29\frac{2}{9}。故 1010 的毒瘤度为 29\frac{2}{9}

可以计算出这四组数据的毒瘤度分别为 89,23,29,23\frac{8}{9},\frac{2}{3},\frac{2}{9},\frac{2}{3}。其中 1010 是唯一毒瘤度最小的,故程序输出其后 22 个字符 10

数据范围与提示

保证所有数据随机生成。对于 01 串的每一位,其为 1 的概率都是 12\frac{1}{2} 且不同位相互独立。

本题不采用捆绑测试,按点给分。测试点 1111 分,其他测试点每个计 33 分。

每个测试点 nn 的规模如下表:

测试点编号 11 272\sim 7 8138\sim 13 141614\sim 16
nn 3\le 3 20\le20 =26=26 =56=56
测试点编号 172017\sim 20 212421\sim 24 252825\sim 28 293429\sim 34
nn =200=200 =500=500 1000\le1000 1500\le 1500

提示:在 C++ 中您可以使用 128128 位整数__int128