Problem - 1109A - Codeforces

Sasha喜欢编程。有一次,在一场很长时间的比赛中,萨沙觉得他有点累了,需要放松一下。他照做了。但由于萨沙不是一个普通人,他更喜欢不同寻常地放松。在闲暇时间,萨沙喜欢解决未解决的问题,因为解决问题非常有用。

因此,Sasha决定解决以下问题:

你有一个包含n个整数的数组a。你需要计算有趣的组合(l,r)的个数(l≤r)。为了检验一对(l,r)是否具有好笑性,取mid=l+r−12,那么如果r−l+1是偶数且al⊕al+1⊕…⊕amid=amid+1⊕amid+2⊕…⊕ar,那么这对组合就是好笑的。换句话说,子数组左半部分元素从l到r的⊕应该等于右半部分元素的⊕。请注意⊕表示按位异或运算。

是时候继续解决比赛了,Sasha让你解决这个任务。

输入

第一行包含一个整数n(2≤n≤3⋅105)——数组的大小。

第二行包含n个整数a1,a2,…,an(0≤ai<220) -数组本身。

输出

打印一个整数——有趣的数字对的个数。你应该只考虑r−l+1为偶数的对偶。

例子

inputCopy

5

1 2 3 4 5

outputCopy

1

inputCopy

6

3 2 2 3 7 6

outputCopy

3.

inputCopy

3.

42 42

outputCopy

0

请注意

像萨沙一样冷静,解决问题!

在第一个例子中,唯一有趣的一对是(2,5),因为2⊕3=4⊕5=1。

在第二个例子中,有趣的组合是(2,3)、(1,4)和(3,6)。

在第三个例子中,没有有趣的配对。

题解:

根题意要我们让一个偶数区间的一半异或结果等于另外一半,

设mid = (l + r - 1)

根据前缀和的性质和异或的性质

al^al+1...^amid = s[mid]^s[l-1]

amid+1^....ar = s[r]^s[mid]

所以s[r] == s[l-1]

接下来我们只需要记录下标为偶数或奇数时,前缀出现次数即可,

#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<cmath>
#include<stack>
#include<set>
using namespace std;
#define int long long
typedef pair<int,int> PII;
const int N = 2e5 + 10;
int a[2][2000050];
void solve()
{int n;cin >> n;a[0][0] = 1;int y = 0;int ans = 0;for(int i = 1;i <= n;i++){int x;cin >> x;y ^= x;ans += a[i%2][y];a[i%2][y]++;}cout << ans;
}
//1 -7 1 -7
signed main(){
//  ios::sync_with_stdio(false);
//  cin.tie(0);
//  cout.tie(0);int t = 1;
//  cin >> t;while(t--){solve();}
}
//3 3 2 2 1 0
//1 2 1 1 1 0

A. Sasha and a Bit of Relax(异或的性质 + 前缀和的性质)相关推荐

  1. Codeforces #539 (Div. 1) A. Sasha and a Bit of Relax (异或 前缀和)

    题目连接: https://codeforces.com/problemset/problem/1109/A 题目大意: 给定n个数 问有多少个偶数长度的区间l,r 使得mid=(l+r-1)/2,l ...

  2. Sasha and a Bit of Relax K倍区间 (前缀和异或 前缀和计数 思维)

    (29条消息) CodeForces - 1109A Sasha and a Bit of Relax(思维+异或和,好题)_Frozen_Guardian的博客-CSDN博客 Sasha and a ...

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

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

  4. CodeForces - 1109A Sasha and a Bit of Relax(思维+异或和,好题)

    题目链接:点击查看 题目大意:给出n个数,现在求满足下面条件的区间数: 对于区间[l,r],r-l+1为偶数 对于中点mid=(r-l+1)/2,满足 求满足条件的区间对数(l,r) 题目分析:一开始 ...

  5. Codeforces Round #539 (Div. 2) C. Sasha and a Bit of Relax

    链接:https://codeforces.com/problemset/problem/1113/C 题意:长度为n的序列 ,若l,r满足,则称这对l,r为funny,其中mid=(r-l+)/2 ...

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

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

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

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

  8. LeetCode 1310. 子数组异或查询(前缀异或)

    1. 题目 有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]. 对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 a ...

  9. 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题

    第一题 给定一个数组,求子数组的最大异或和. 一个数组的异或和为,数组中所有的数异或起来的结果. 简单的前缀树应用 暴力方法: 先计算必须以i结尾的子数组的异或和,然后再计算机i+1的,以此类推... ...

最新文章

  1. 【Python】Numpy扩充数组函数之repeat和tile用法
  2. 光纤收发器的7大挑选技巧
  3. Spring Boot : Bean标签属性
  4. copyWebpackPlugin的使用及常见问题(glob及Path ............... is not in cwd)
  5. 大一java题库及答案_2016最新java考试题库及答案
  6. 4.6.2 IPv6的地址
  7. VMware虚拟机三种网络模式详解与配置
  8. VB中Byval与Byref的区别。
  9. 在Ubuntu 18.04 Bionic Beaver上安装Wine
  10. Java 开发工程师的核心竞争力
  11. [P3371 ]【模板】单源最短路径
  12. 简单搜索app产品分析
  13. mysql+php+模板+条目_html模板
  14. 软件测试工程师薪金待遇大比拼
  15. LGD计划扩增OLED TV面板产能
  16. 某校教务管理系统post分析,Python实现自动查询成绩并发送短信
  17. 2021-07-04 m3u8格式直播地址
  18. [容斥 状压DP] HDU4997. Biconnected
  19. 在wps里面怎么设置触发器_利用WPS演示中的触发器控制板书内容的方法
  20. WebServices 与 Web API 的区别

热门文章

  1. I2C总线3.3V与5V双向电平转换电路
  2. steam搬砖价值3000的教程
  3. 2011计算机考研大,2011年计算机考研大纲
  4. 用Matlab提取图片中泰文,利用Matlab提取图片中的数据
  5. redhat linux中文,Redhat 中文解决方案
  6. android webview第三方框架,Android 中使用第三方 WebView,腾讯X5浏览器
  7. 光纤的特性参数有哪些?
  8. 淮北市第四届机器人比赛_淮北市第三实验小学组织学生参加2020年淮北市中小学生机器人竞赛“果力WYAI人工智能挑战赛”...
  9. WebSocket入门介绍及编程实战
  10. 2022年端边云协同的AI视觉产业研究报告