海明码
题号:NC214191
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

“在数据通信中,通常只需要数据具有检错能力,因为接收端一旦检查出错误,即可通知发送端重新发送来保证正确性。但在许多情况下,接收端接收的数据是非再生或实时的数据,这就要求出传送的数据不仅具备错误检查能力,同时还应具有错误纠正能力。海明校验码就是一种最有效、最经典的具备检错纠错能力的数据校验码,但它仅能纠正一位出错,当两位出错时,无法给出出错位所在位置。”

“海明码将数据的有效编码按照某种规律分成若干组,每组配置一位检验位来使组内的数位进行奇偶校验,通过提供多个检错信息,就能够确定错误位在数据校验码中的位置,进而加以纠正。”

“设检验位的个数为r,有效数据的长度为k,则检验位个数与有效数据长度的关系满足:2r>=k+r+1;
设长度为K的有效数据编码从高到低依次为Dk···D2,D1(k=1,2···k),r位奇偶校验位从高到低依次为Pr···P2,P1(r=1,2,···r),有效数据位与奇偶校验位在海明校验码中的排列原则为:第i位检验位Pi必须处于海明位第2^(i-1)位的位置,有效数据位在其余的海明码位置上顺序排列。”



“海明校验码的分组规则为:奇偶校验位只参加一组奇偶校验,有效编码位至少参加两组奇偶校验,每组只有一位奇偶校验位;第i位海明码位置的数据被校验位所在海明码位之和的等于i的哪些校验位所检验。”

“海明校验码每个分组中的一位奇(偶)校验位由该组中被校验的若干位有效数据位中1的奇偶性得到。”

“判断接收到的海明码中校验位的奇偶性与该校验位对应校验的若干位有效数据位的奇偶性的关系,如果出现错误便将该位对应的出错信号记为1,否则为0;将所有的出错信号连在一起,对应的十进制数就是出错位置的海明码位置(在最多只有一位错误的情况下)。”

现在需要你来模拟发送方(sender)和接收方(receiver),分别对待发送的有效数据和接收到的海明校验码进行处理:
作为发送方,你需要根据要求,将有效数据生成对应的校验码;
作为接收方,你需要根据收到的校验码,先判断接收到的信息是否出现了错误,如果没有错误,则直接输出海明校验码对应的有效数据;否则如果出现错误,则输出纠错后的有效数据。

规定,左侧的数位编号大于右侧的数位,长度不足的位填充0。

输入描述:

多组输入
每组输入第一行输入一个字符串("sender"或"receiver"),表明当前模拟的是发送方或是接收方,
第二行输入一个字符串("odd"或"even"),表明当前使用奇校验或是偶校验,
第三行输入一个整数l以及一个01字符串s;整数l代表字符串的长度,字符串s对应代表未被编码成海明校验码的有效数据或是未验证是否正确的海明校验码。
(3 <= l <= 70000)、保证接收方收到的海明校验码最多只有一位错误且不出现在校验位上

输出描述:

对于属于发送方的输入,在一行内输出对应生成的海明校验码,没有数据的空位填充0;
对于输入接收方的输入,输出(直接或纠错后)正确的有效数据,保证输入的长度l恰好满足2r>=l+r+1,其中r等于校验位的数量。
示例1

输入

复制
sender
odd
3 000
receiver
even
7 0001000

输出

复制
0001011
0000