2019年三峡大学新生编程赛||Chocolate

该博客详细介绍了2019年三峡大学新生编程赛中的一道题——Chocolate,涉及用二进制串进行异或运算。题目要求根据给定的异或结果,求原始的二进制串。博客提供了输入输出描述、限制条件、解题思路和程序代码,并强调了解题过程中逻辑思维和前缀和的应用。
摘要由CSDN通过智能技术生成

2019年三峡大学新生编程赛

5.Chocolate

(1)题目内容:

还是小W,他挑选完给小H的完美巧克力之后自己吃完了剩下的巧克力,他发现:
巧克力是世界上最好吃的东西!
所以他火速下单又购买了一批巧克力。
这次的巧克力中有黑白两种巧克力豆,小W仔细观察,认真分析,取出两种巧克力,摆成一排:你看这个巧克力豆又大又圆,多像二进制串啊!
所以他决定用黑白巧克力豆来出这道题。
现在抽象此问题,给定p,q,给出长度为p的二进制串,将此二进制串向后移动一次,共移动q-1次,可以算出p+q-1位的每一位异或值,所谓异或即是
0 ^ 0=0,1 ^ 1=0,0^1=1,即相同取零, 相异取1,当p = 6, q = 3时
101010
 101010
  101010
11010110
即结果为11010110, 现已知结果, 求初始的二进制串
第一行一个整数T(0<=T<=20)表示有T组样例,之后的T行每一行一个整数n(0<=n<=10e9),表示有n个圆

(2)输入描述

第一行两个正整数
第二行(p + q - 1)位二进制串
数据范围:
0<m<=n<=1000000
1<=n+m-1<=1000000

(3)输出描述

输出长为p的二进制串

(4)输入样例

6 3
11010110

(5)输出样例

101010

(6)限制条件

JAVA 运行时间 2000ms 运行内存 3000kb
C++ 运行时间 1000ms 运行内存 3000kb

(7)程序代码

#include <stdio.h>
char s[2000050];
char a[2000050];
int main() {
  int p, q;
  scanf_s("%d%d", &p, &q);
  scanf_s(" ");
  int i;
  for (i = 1; i <= p + q - 1; i++) scanf_s("%c", &a[i]);
  s[1] = a[1];
  for (i = 2; i <= q; i++) {
    s[i] = ((a[i - 1]-'0') ^ (a[i]-'0'))+'0';
  }
  for (i = q + 1; i <= p; i++) {
    s[i] = ((a[i - 1]-'0') ^ (s[i - q]-'0') ^ (a[i]-'0'))+'0';
  }
  s[p] = a[p + q - 1];
  for (i = p + q - 1; i >= p+1 ; i--) {
    s[i - q] = ((a[i] - '0') ^ (a[i - 1] - '0')) + '0';
  }
  for (i = 1; i <= p; i++) {
    printf("%c", s[i]);
  }
  return 0;
}

(8)解题思路以及题目分析

本题对思维的考察较高,根据题意可以很轻松的推出异或运算的逆推表达式,根据题目所给的条件,我们可以知道长度为p+q-1的字符串为输入的二进制串,在这里把他定义为a串,而p就是题目要求我们推导的原来的二进制串的长度,在这里将原二进制串定义为b串,而q代表叠加次数。从第一项开始分析,可以发现a串的第一项等于b串第一项,a串的第二项由b串第二项与第一项进行异或运算得来,a串第三项由b串第一项,第二项,第三项共同异或构成,而b串第一项,第二项进行运算构成了a第二项,那么a串第三项就是由a串第二项和b串第三项异或构成,可知,当此下标小于或等与q时,也就是说a串的前q项都满足a[i]=b[i]a[i-1],当数组下标大于q时,规律会发生变化,从此时开始,a[i]由包括b[i]在内的q个b串中元素异或组成,即a[i]=b[i]……b[i-q+1],此时如果运用暴力解法进行循环,很有可能会发生超时的情况,所以在这里要运用到一个==前缀和==的知识,在计算到a串的第q项(在此题中,我们认为a,b字符串均从a[1],b[1]开始储存,那么第i项就对应a[i],b[i],便于理解)时,我们可以用一个自定义变量x记录下此时a[q]的值,所以此时x就代表b串前q项异或的值,当我们计算第a[q+i]时,就将x与b[i]进行异或运算的逆运算,然后将结果覆盖x,此时a[q+i]=b[q+i]x;在这样得出b[q+i]的时候,只要是运算还没有结束,我们就使x=a[q+i],在进行下一步运算时又先与b[i]先进行逆运算赋值,在得出b的下一项,以此类推,就可以推导出b串。

(9)题目总结

此题目难度较大,需要较强的逻辑,而且输入的是字符,将其变为数字1和0还应该进一步处理,减去‘0’。
此题目为牛客网一道原题,在此分享一篇讲解此题目比较详细的博客
链接: https://blog.csdn.net/Meloor/article/details/91148808?utm_source=app

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值