题目描述

输入一个长度为n(1 <= n <= 100000)数组a[1], a[2], …, a[n]。
输入一个询问数m(1 <= m <= 100000)和m组询问,每组询问形如(l, r)
对于每组询问(l, r),你需要输出a[l] xor a[l + 1] xor … xor a[r - 1] xor a[r],即第l个数字到第r个数字的异或。
如果你的算法需要约n*m的时间,你将只能通过第一个测试点。
如果你的算法需要约n+m的时间,你将可以通过本题。
输入
第一行一个整数n
第二行为n个整数a[1], a[2], … a[n]
第三行一个整数m
接下来m行,每行两个整数l, r表示询问。
输出
输出一共m行,对于每一个询问输出一个整数表示结果。
输入样例
3
1 2 3
6
1 1
2 2
3 3
1 2
2 3
1 3
输出样例
1
2
3
3
1
0

题解:

题面已经说过了n+m才能通过,加上输入的m组询问,和一开始输入的n个数字元素,那已经n+m的时间了,所以每次查询的时间复杂度只能是O(1)了,从一个O(n)的循环优化到O(1),那很明显就是利用前缀的性质了,但是又不像以前用的多的经常是a[r] - a[l-1],这里的运算是异或。
那我们分析一下异或有一个性质:异或同一个二进制两次结果不变 => 异或同一个十进制两次结果不变,所以先直接求出前缀异或,然后a[r]^a[l-1]即可,因为a[l-1]之内的数已经两两之间异或了一次了,a[r]包括了l-1之内的数,那又会两两异或一次,所以相当于结果没变,那么中间l-r的异或结果也出来了(其实这里我也不太明白 - 待理解)。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
using namespace std;typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll  INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 1e5+5;
int n;
int a[MAX];
int m;
int l,r;int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;for(int i = 1; i <= n; i++){cin >> a[i];}// 异或:相同为0,相异为1// 0^0 = 0 0^1 = 1// 1^0 = 1 1^1 = 0for(int i = 1; i <= n; i++){a[i] ^= a[i-1];}cin >> m;for(int i = 1; i <= m; i++){cin >> l >> r;/* 超时int res = a[l];for(int i = l+1; i <= r; i++){res ^= a[i];}*/cout << (a[r]^a[l-1]) << endl;}return 0;
}

51Nod 2128 前缀异或 c/c++题解相关推荐

  1. 【51nod - 前缀异或】 对前缀和的理解

    题干: 前缀异或  基准时间限制:2 秒 空间限制:131072 KB 分值: 5 输入一个长度为n(1 <= n <= 100000)数组a[1], a[2], ..., a[n]. 输 ...

  2. 【牛客每日一题】 4.13 Xorto(前缀异或和,枚举优化/映射)

    链接:https://ac.nowcoder.com/acm/problem/14247 来源:牛客网 题目描述 给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为 ...

  3. CF1592E Bored Bakry(二进制+前缀异或和)

    CF1592E Bored Bakry description solution code description 题目链接 solution and\text{and}and如果第iii位为111, ...

  4. LeetCode 1829. 每个查询的最大异或值(前缀异或 + 位运算)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 有序 数组 nums ,它由 n 个非负整数组成,同时给你一个整数 maximumBit .你需要执行以下查询 n 次: 找到一个非负整数 k ...

  5. LeetCode 1442. 形成两个异或相等数组的三元组数目(前缀异或)

    1. 题目 给你一个整数数组 arr . 现需要从数组中取三个下标 i.j 和 k ,其中 (0 <= i < j <= k < arr.length) . a 和 b 定义如 ...

  6. CodeForces.1174D.EhabandtheExpectedXORProblem(构造前缀异或和数组)

    题目链接 这道题比赛的时候没做出来,赛后补题的时候发现其实可以构造一个前缀异或和数组,然后根据初始化的第一个值进行填数,但是作为菜鸡的我虽然坚信自己的想法是正确的却想了很久也没有能够构造出来所谓的前缀 ...

  7. 前缀异或:XOR Segment (用的是前缀和的思想,所以暂且称这个方法为前缀异或)

    XOR Segment Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total S ...

  8. 异或性质——前缀异或

    昨天遇到一个非常神奇的事情,异或也能维护前缀和? 有两个例题: 例一.子段异或 描述: 给出长度为n的数列,问 异或值为0的子段一共有多少? 思路: 之前有一个考前缀和的,求子段和为0的子段个数,做法 ...

  9. 51NOD 1773:A国的贸易——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1773 参考1:FWT讲解 https://www.cnblogs.com ...

最新文章

  1. Bzoj 1046: [HAOI2007]上升序列 二分,递推
  2. (42)驱动中使用全局变量
  3. 语音怎么进入滤波器matlab,基于Matlab的语音信号滤波器的设计与实现
  4. C++使用链表实现queue之二(附完整源码)
  5. IOS开发--TextField
  6. 通过标准的 ASP.NET 控件来使用 jQuery UI
  7. C语言之文件读写探究(七):随机读写文件
  8. this 改变this的指向
  9. 时序分析 30 金融资产预测 - 蒙特卡洛模拟
  10. 告诉你怎样学Java才是硬道理(转自chinaitlab)
  11. java 几何平均数_统计学——平均数
  12. 基于微信小程序的高校课堂教学管理系统#毕业设计
  13. 快照劫持 4种方法教你如何处理百度快照劫持系列问题
  14. 系统安装-U盘安装Windows XP SP3纯净版简述
  15. 倾斜摄影当中重叠度、传感器尺寸、焦距等参数问题梳理
  16. redux中导入createStore中间有条线,解决方案及redux的使用。(react)
  17. 法国西南华人华侨商会:进军区块链行业,促进技术创新项目落地
  18. 用计算机弹起风了歌词,买辣椒也用券
  19. (ICRA 2020) Instance Segmentation of LiDAR Point Clouds
  20. 海康威视设备在Web端显示实时(回放)视频

热门文章

  1. cadence SPB17.4 capture and cis 全部错误消息列表
  2. 的确,人在做,天在看
  3. 来11:1 信就是所望之事的实底,是未见之事的确据。
  4. 百度语音合成与语音识别api使用(Java版本)
  5. 传奇如何读取服务器信息,传奇服务器修改之命令服务脚本详细使用方法介绍
  6. 大数据-计算引擎:MapReduce、TEZ、Spark【Hive可选用的三大计算引擎】
  7. MDK keil 图标显示异常的解决办法
  8. 计算机辅助制造卜昆内容,西北工业大学07年硕士生入学考试专业课大纲(428计算机辅助制造)...
  9. 百度工程师带你探秘C++内存管理(理论篇)
  10. PMD相位提取及相位展开简述