异或和之和

题目:

0异或和之和 - 蓝桥云课

异或和之和

题目描述

给定一个数组 Ai​,分别求其每个子段的异或和,并求出它们的和。或者说,对于每组满足 1≤L≤R≤n 的 L,R,求出数组中第 L 至第 R 个元素的异或和。然后输出每组 L,R 得到的结果加起来的值。

输入格式
  • 输入的第一行包含一个整数 n。
  • 第二行包含 n 个整数 Ai,相邻整数之间使用一个空格分隔。
输出格式
  • 输出一行包含一个整数表示答案。
样例输入
复制代码
5
1 2 3 4 5
样例输出
复制代码
39
评测用例规模与约定
  • 对于 30% 的评测用例,n≤300;
  • 对于 60% 的评测用例,n≤5000;
  • 对于所有评测用例,1≤n≤1e5,0≤Ai≤2的20次方。

思路:

如果暴力求,就需要三层循环,超时的,所以我们可以利用前缀和数组。为什么异或也可以呢,

pre[j] 是 arr[1] ^ arr[2] ^ ... ^ arr[j]

pre[i-1] 是 arr[1] ^ arr[2] ^ ... ^ arr[i-1]

当我们计算 pre[j] ^ pre[i-1] 时,从arr[1]到arr[i-1]的部分在两个前缀和中都存在,并且由于异或的自反性(a ^ a = 0),这些部分会被抵消掉,留下的就是arr[i]到arr[j]的异或结果。

代码如下:

复制代码
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll N = 1e5+5;
ll n;
ll arr[N];
ll pre[N];
ll sum;
int main()
{
	cin >> n;
	for(ll i = 1 ; i <= n ; i++)
	{
		cin >> arr[i];
		pre[i] = pre[i-1] ^ arr[i];
	}
	for(ll i = 1 ; i <= n ; i++)
	{
		for(ll j = i ; j <= i ; j++)
		{
			sum += (pre[j] ^ pre[i-1]);		
		}
	}
	cout << sum;
	return 0;
}

O(n*n)肯定超时啊

优化2:

相关推荐
Swift社区2 分钟前
LeetCode 472 连接词
算法·leetcode·职场和发展
Dream it possible!3 分钟前
LeetCode 面试经典 150_二分查找_搜索旋转排序数组(114_33_C++_中等)
c++·leetcode·面试
CoovallyAIHub9 分钟前
YOLO-Maste开源:首个MoE加速加速实时检测,推理提速17.8%!
深度学习·算法·计算机视觉
清铎12 分钟前
leetcode_day13_普通数组_《绝境求生》
数据结构·算法
_OP_CHEN15 分钟前
【从零开始的Qt开发指南】(二十)Qt 多线程深度实战指南:从基础 API 到线程安全,带你实现高效并发应用
开发语言·c++·qt·安全·线程·前端开发·线程安全
2301_8008951020 分钟前
hh的蓝桥杯每日一题(二分)--立定跳远
职场和发展·蓝桥杯
hetao173383723 分钟前
2026-01-09~12 hetao1733837 的刷题笔记
c++·笔记·算法
fqbqrr26 分钟前
2601C++,模块导出分类
前端·c++
say_fall38 分钟前
泛型编程基石:C++ 模板从入门到熟练
java·开发语言·c++·编辑器·visual studio
txinyu的博客44 分钟前
结合游戏场景解析UDP可靠性问题
java·开发语言·c++·网络协议·游戏·udp