#P2498. 海明码

海明码

题面描述

小 A 想给小 B 传输一串长度为 nn 的二进制数 a1a2...ana_1a_2...a_n,但由于外界环境的干扰,传输的二进制数的某一位可能发生改变,为了应对这个问题,小 A 学习了海明码。

海明码(Hamming code)是一种线性误差更正码,由理查德·海明(Richard Hamming)在1950年发明。它能够检测和纠正单一比特的错误。海明码通过在数据位之间插入额外的校验位来实现这种错误检测和更正的功能。

t=log2(n+1)t=\lceil \log_2(n+1)\rceil ,则小 A 会在这 nn 位二进制码的后面补上 t+1t+1b0b1...bt1cb_0b_1...b_{t-1}c

其中 bib_i 的值为所有二进制第 ii 位为 11 的数 jjaja_j 异或和。例如 n=6n=6 ,则 b1=a2a3a6b_1=a_2\oplus a_3\oplus a_6 ,而 cc 为所有 aia_i 的异或和,即 c=a1a2...anc=a_1\oplus a_2\oplus...\oplus a_n

这样将小A 将 a1a2...anb0b1...bt1ca_1a_2...a_nb_0b_1...b_{t-1}c 传输给小 B ,那么小B 得到的是 A1A2...AnB0B1...Bt1CA_1A_2...A_nB_0B_1...B_{t-1}C,小 B 就可以通过 BiB_iCC 的值来判断他收到的 A1A2...AnA_1A_2...A_na1a2...ana_1a_2...a_n 相比,是否有某一位发生了改变,如果发生了那改变的是哪一位?

现在小 B 希望得到 a0a1...an1a_0a_1...a_{n-1} 到底是什么,请你帮帮他!

小 A 贴心的为小 B 提供了一个判断过程:

  • CA1A2...An=0C\oplus A_1\oplus A_2\oplus...\oplus A_n=0 ,则说明 a1a2...an=A1A2...Ana_1a_2...a_n=A_1A_2...A_n
  • CA1A2...An=1C\oplus A_1\oplus A_2\oplus...\oplus A_n=1 ,按接下来的步骤处理:
    • 设一个未知数 ff
    • 对于每一个 ii ,我们设 did_i 的值为所有二进制第 ii 位为 11 的数 jjAjA_j 异或和.
      • diBi=1d_i\oplus B_i=1 ,我们就令 ff 二进制的第 ii 位是 11
      • diBi=0d_i\oplus B_i=0 ,我们就令 ff 二进制的第 ii 位是 00
    • 最后若 f=0f=0a1a2...an=A1A2...Ana_1a_2...a_n=A_1A_2...A_n
    • 否则对于所有 if,ai=Aii\neq f,a_i=A_iAf=af1A_f=a_f\oplus1

输入格式

11 行包含一个正整数 nn,表示二进制数的位数。

22 行为 n+log2n+1n+\lceil \log_2n\rceil+1 位的 0101 字符串,表示小 B 收到的 $A_0A_1...A_{n-1}B_0B_1...B_{\lceil \log_2n\rceil-1}C$ 。

输出格式

输出一行长度为 nn0101 串,表示 a0a1...an1a_0a_1...a_{n-1}

样例一

7
11100010101
1110101

样例解释

因为 A1A2...A7C=1A_1\oplus A_2\oplus...\oplus A_7\oplus C=1 ,且

  • A1A3A5A7b0=1A_1\oplus A_3\oplus A_5\oplus A_7\oplus b_0=1
  • A2A3A6A7b1=0A_2\oplus A_3\oplus A_6\oplus A_7\oplus b_1=0
  • A4A5A6A7b2=1A_4\oplus A_5\oplus A_6\oplus A_7\oplus b_2=1

所以 f=5f=5 ,所以 a0a1...an1=1110101a_0a_1...a_{n-1}=1110101

数据范围

对于所有数据 n107n\le 10^7 ,保证数据合法。