链接:https://ac.nowcoder.com/acm/contest/904/A
来源:牛客网

题目描述

DongDong是一个喜欢密码学的女孩子,她养的萨摩耶叼着一张带着加密信息的纸条交给了她,如果她不能破解这张密码,萨摩耶是不会高兴的。

给定n,m,给出长度为n的01串,每次向后移动一位,移动m-1次,最后求出这n+m-1位每一位的异或值(0^0=0,1^1=0,0^1=1)成为密码。(如下图这样,此时n=6,m=3)

输入描述:

第一行两个整数,n和m第二行一个01串(共n+m-1位)2<=n+m<=1000000

输出描述:

第一行输出答案:长度为n的01串(保证存在答案)

示例1

输入

6 3
11010110

输出

101010

解题思路

解这到题要用到前i个数的异或和
首先我们要明白异或的性质
1 任何数和0异或都为它本身
2 任何数和它本身异或结果都为0
 
定义sum[i]表示前i个数的异或和
那么区间[i,j]的异或和可表示为sum[j]^sum[i-1]
证明:这里假设下标从1开始 
sum[j]可以表示为sum(1,i-1)^sum(i,j)
sum[j]^sum[i-1] = sum(1,i-1)^sum(i,j)^sum(1,i-1) = sum(i,j)
 
本题思路:
假设结果串为aa[],源串为b[]
sum[i]表示串b[]的前i个数的异或和 
对于结果串aa[],长度为(n+m-1) 
区间[1,m]    aa[i]为源串前i个数的异或和,aa[i]=sum[i-1]^b[i],所以b[i] = aa[i]^sum[i-1] 
区间[m,n]    aa[i]为m个数的异或和,已知前m-1个数,其异或和为sum(i-m+1,i-1)=sum[i-1]-sum[i-m],
            aa[i] = sum(i-m+1,i)=sum(i-m+1,i-1)^b[i] ,所以b[i] = aa[i]^sum(i-m+1,i-1)

AC代码

#include<iostream>
using namespace std;
const int N = (int)(1e6+5);
char a[N];
int aa[N];
int b[N];
int sum[N];//sum[i]表示b中前i个数的异或和
int n,m;
void solve(){for(int i=0;i<n;i++)aa[i+1]=a[i]-'0';sum[0]=0;for(int i=1;i<=m-1;i++){       b[i]=aa[i]^sum[i-1];sum[i]=sum[i-1]^b[i];}//(i-m+1,i-1)之间的数异或可表示为sum[i-1]^sum[i-m] for(int i=m;i<=n;i++){b[i]=aa[i]^(sum[i-1]^sum[i-m]);sum[i]=sum[i-1]^b[i]; }for(int i=1;i<=n;i++)cout<<b[i];cout<<endl;
}
int main(){ios::sync_with_stdio(false);while(cin>>n>>m){cin>>a;solve();}  return 0;
}

区间异或和——DongDong破密码相关推荐

  1. A.DongDong破密码

    链接:https://ac.nowcoder.com/acm/contest/904/A 题意: DongDong是一个喜欢密码学的女孩子,她养的萨摩耶叼着一张带着加密信息的纸条交给了她,如果她不能破 ...

  2. 2021牛客暑期多校训练营4 Tree Xor (区间异或上一个数+区间求交)

    题解: 首先我们可以发现,只要确定了一个值,那么树上其他的值也可以确定下来了,但是显然,遍历一棵树的时间复杂度为O(n),如果枚举+暴力判断的话时间复杂度O(1e9∗n)O(1e9*n)O(1e9∗n ...

  3. Codechef REBXOR HYSBZ - 4260(01字典树+区间异或最大)

    Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,-,AN. Output 输出一行包含给定表达式可能的最大值. Sample Input 5 1 2 ...

  4. 2021牛客第四场-E Tree Xor-线段树区间异或

    https://ac.nowcoder.com/acm/contest/11255/E 题目大意:有n个点,每一点有一个区间[l,r]范围的权值可能,有n-1条边,边上的权值为w,w=w(u)^w(v ...

  5. Consecutive Sum LightOJ - 1269(区间异或和)

    Consecutive Sum 又来水一发blog... 本来是昨天补codechef的题,最后一道题是可持久化字典树,然后去黄学长博客看了看 觉得字典树写法有点不太一样,就想着用黄学长的板子写码几道 ...

  6. 小偷偷银行卡破密码_我如何阻止信用卡小偷被盗3,537个人-并在此过程中挽救了我们的非营利组织...

    小偷偷银行卡破密码 My 2 year old woke me up by canonballing from my bed's headboard down onto my face. I groa ...

  7. 线段树 ---- 牛客多校4 ETree Xor 区间异或分段

    题目链接 题目大意: 就是给你nnn个节点的树,树上每个节点都有一个权值wi∈[li,ri]w_i\in[l_i,r_i]wi​∈[li​,ri​],以及相邻(u,v)(u,v)(u,v)的异或值wu ...

  8. P4735 最大异或和(可持久化trie树、求最大区间异或和)

    P4735 最大异或和 我们维护一个前缀异或和:s[i]=a[1]xora[2]xor-a[i−1]xora[i]s[i] = a[1] \ xor\ a[2]\ xor\ - a[i-1] \ xo ...

  9. LintCode 1652. 区间异或 II

    1. 题目 给定数组 A(下标从0到n-1,n为数组长度),和一个查询列表. 每一项查询包括两个整数 i 和 k. 对于每次查询,计算Ai, A(i + 1), ..., A(i+k-1)的异或值.结 ...

  10. HDU 5465 Clarke and puzzle (二维树状数组维护区间异或)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5465 解题思路: 因为要对大量的区间进行异或,所以考虑用二维树状数组就行维护. #include< ...

最新文章

  1. c语言组队,组队列问题。会做的高手帮帮忙啊
  2. 麻省理工牛人解说数学体系
  3. Mysql基础知识—索引
  4. 使用mkfs.ext4格式化大容量磁盘
  5. CentOS7中多台服务器配置SSH免密钥登录
  6. websocket没准备好如何解决_那些很重要,但是不常用的技术,websocket
  7. scott登录查询常用语句
  8. LINUX之网络编程j简述
  9. 80-20-010-原理-字符编码-字符编码
  10. 使用 .NET 平台,如何玩转 Universal Windows 应用?
  11. Python学习之路23-文本和字节序列
  12. LeetCode 16最接近的三数之和
  13. hdu--1160--LIS+打印路径
  14. Linux如何修改makefile文件,linux中Makefile的使用
  15. 快手视频批量下载,一个脚本就够了,手把手教你批量下载快手高清视频。
  16. Android基础--ListView的刷新
  17. 密码学和Java加密与解密技术
  18. SHELL命令 -- 查看显卡型号
  19. (线段判交的一些注意。。。)nyoj 1016-德莱联盟
  20. Java 微服务实践

热门文章

  1. 多模块渗透测试框架PTF
  2. 移动端开发----el-select、div点击出现蓝色背景色
  3. html不用画布太阳系示意图,html5-canvas-太阳系2
  4. 大二暑假立秋学习总结
  5. 为什么程序员要会linux
  6. CodeReview流程梳理
  7. 一款完整的企业级CMS站群系统源码,采用了比较典型的三层架构技术,源码分享
  8. 用计算机和电视机组成家庭影院,用电脑组建家庭影院:  最方便最实惠的玩法...
  9. 我的第一个Python爬虫——谈心得
  10. win7无法设置时间更新服务器未响应,win7电脑提示系统时间设置有误请更新系统日期...