区间异或和——DongDong破密码
链接: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破密码相关推荐
- A.DongDong破密码
链接:https://ac.nowcoder.com/acm/contest/904/A 题意: DongDong是一个喜欢密码学的女孩子,她养的萨摩耶叼着一张带着加密信息的纸条交给了她,如果她不能破 ...
- 2021牛客暑期多校训练营4 Tree Xor (区间异或上一个数+区间求交)
题解: 首先我们可以发现,只要确定了一个值,那么树上其他的值也可以确定下来了,但是显然,遍历一棵树的时间复杂度为O(n),如果枚举+暴力判断的话时间复杂度O(1e9∗n)O(1e9*n)O(1e9∗n ...
- Codechef REBXOR HYSBZ - 4260(01字典树+区间异或最大)
Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,-,AN. Output 输出一行包含给定表达式可能的最大值. Sample Input 5 1 2 ...
- 2021牛客第四场-E Tree Xor-线段树区间异或
https://ac.nowcoder.com/acm/contest/11255/E 题目大意:有n个点,每一点有一个区间[l,r]范围的权值可能,有n-1条边,边上的权值为w,w=w(u)^w(v ...
- Consecutive Sum LightOJ - 1269(区间异或和)
Consecutive Sum 又来水一发blog... 本来是昨天补codechef的题,最后一道题是可持久化字典树,然后去黄学长博客看了看 觉得字典树写法有点不太一样,就想着用黄学长的板子写码几道 ...
- 小偷偷银行卡破密码_我如何阻止信用卡小偷被盗3,537个人-并在此过程中挽救了我们的非营利组织...
小偷偷银行卡破密码 My 2 year old woke me up by canonballing from my bed's headboard down onto my face. I groa ...
- 线段树 ---- 牛客多校4 ETree Xor 区间异或分段
题目链接 题目大意: 就是给你nnn个节点的树,树上每个节点都有一个权值wi∈[li,ri]w_i\in[l_i,r_i]wi∈[li,ri],以及相邻(u,v)(u,v)(u,v)的异或值wu ...
- 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 ...
- LintCode 1652. 区间异或 II
1. 题目 给定数组 A(下标从0到n-1,n为数组长度),和一个查询列表. 每一项查询包括两个整数 i 和 k. 对于每次查询,计算Ai, A(i + 1), ..., A(i+k-1)的异或值.结 ...
- HDU 5465 Clarke and puzzle (二维树状数组维护区间异或)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5465 解题思路: 因为要对大量的区间进行异或,所以考虑用二维树状数组就行维护. #include< ...
最新文章
- c语言组队,组队列问题。会做的高手帮帮忙啊
- 麻省理工牛人解说数学体系
- Mysql基础知识—索引
- 使用mkfs.ext4格式化大容量磁盘
- CentOS7中多台服务器配置SSH免密钥登录
- websocket没准备好如何解决_那些很重要,但是不常用的技术,websocket
- scott登录查询常用语句
- LINUX之网络编程j简述
- 80-20-010-原理-字符编码-字符编码
- 使用 .NET 平台,如何玩转 Universal Windows 应用?
- Python学习之路23-文本和字节序列
- LeetCode 16最接近的三数之和
- hdu--1160--LIS+打印路径
- Linux如何修改makefile文件,linux中Makefile的使用
- 快手视频批量下载,一个脚本就够了,手把手教你批量下载快手高清视频。
- Android基础--ListView的刷新
- 密码学和Java加密与解密技术
- SHELL命令 -- 查看显卡型号
- (线段判交的一些注意。。。)nyoj 1016-德莱联盟
- Java 微服务实践
热门文章
- 多模块渗透测试框架PTF
- 移动端开发----el-select、div点击出现蓝色背景色
- html不用画布太阳系示意图,html5-canvas-太阳系2
- 大二暑假立秋学习总结
- 为什么程序员要会linux
- CodeReview流程梳理
- 一款完整的企业级CMS站群系统源码,采用了比较典型的三层架构技术,源码分享
- 用计算机和电视机组成家庭影院,用电脑组建家庭影院: 最方便最实惠的玩法...
- 我的第一个Python爬虫——谈心得
- win7无法设置时间更新服务器未响应,win7电脑提示系统时间设置有误请更新系统日期...