开始: 2024-10-14 00:00:00

(24-25赛季)稠州常规赛05

结束: 2024-10-17 00:00:00
当前  2025-01-24 14:00:57  类型: IOI  状态: 已经结束 

P2. 海明码(hamming)
描述

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


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


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


其中 b_i 的值为所有二进制第 i 位为 1 的数 ja_j 异或和。例如 n=6 ,则 b_1=a_2\oplus a_3\oplus a_6 ,而 c 为所有 a_i 的异或和,即 c=a_1\oplus a_2\oplus...\oplus a_n


这样将小A 将 a_1a_2...a_nb_0b_1...b_{t-1}c 传输给小 B ,那么小B 得到的是 A_1A_2...A_nB_0B_1...B_{t-1}C,小 B 就可以通过 B_iC 的值来判断他收到的 A_1A_2...A_na_1a_2...a_n 相比,是否有**某一位**发生了改变,如果发生了那改变的是哪一位?


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


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


* 若 C\oplus A_1\oplus A_2\oplus...\oplus A_n=0 ,则说明 a_1a_2...a_n=A_1A_2...A_n

* 若 C\oplus A_1\oplus A_2\oplus...\oplus A_n=1 ,按接下来的步骤处理:

  * 设一个未知数 f

  * 对于每一个 i ,我们设 d_i 的值为所有二进制第 i 位为 1 的数 jA_j 异或和.

    * 若 d_i\oplus B_i=1 ,我们就令 f 二进制的第 i 位是 1

    * 若 d_i\oplus B_i=0 ,我们就令 f 二进制的第 i 位是 0

  * 最后若 f=0  则 a_1a_2...a_n=A_1A_2...A_n

  * 否则对于所有 i\neq f,a_i=A_iA_f=a_f\oplus1


输入

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


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


输出

输出一行长度为 n01 串,表示 a_0a_1...a_{n-1}

样例

输入

7
11100010101

输出

1110101
提示

样例解释

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

A_1\oplus A_3\oplus A_5\oplus A_7\oplus b_0=1 

A_2\oplus A_3\oplus A_6\oplus A_7\oplus b_1=0 

A_4\oplus A_5\oplus A_6\oplus A_7\oplus b_2=1 

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

数据范围

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

| 测试点     | 数据范围            | 特殊性质   |

| ---------- | ------------------------------------- | ---------- |

| 1\sim 4 | n=3 | 无 |

| 5\sim 8 | n=7 | 无 |

| 9\sim 11 | n< 1024 | 无 |

| 12\sim 14 | n<2^{20} | \text{A} |

| 15\sim 17 | 保证 n=2^k-1,k\le20 且为整数 | 无 |

| 18\sim 19 | n<2^{20} | 无 |

| 20 | 无限制 | 无 |

\text{A}: 保证 A_0=A_1=...=A_{n-1}=0


提交

题目参数
时间限制 1 秒
内存限制 512 MB
提交