异或和之和

题目:

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次方。

思路:

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

prej 是 arr1 ^ arr2 ^ ... ^ arrj

prei-1 是 arr1 ^ arr2 ^ ... ^ arri-1

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

代码如下:

复制代码
#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:

相关推荐
学代码的CJY11 分钟前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
小溪学编程31 分钟前
从 C++ 的规范变迁看语言发展
jvm·c++·面试
白帽攻防录32 分钟前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
小O的算法实验室1 小时前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法
ShineWinsu1 小时前
对于Redis:string类型的解析
java·c++·redis·分布式·缓存·面试·string
字节跳动的猫2 小时前
LikeShop 积分体系全链路改造:获取规则、订单抵扣与积分商品兑换二开
运维·数据结构
可乐ea2 小时前
AI Agent 工具调用准确性评测:选择错误与参数错误分开测
大数据·人工智能·算法·大模型·工具调用·ai智能体·agent评测
上位机妹子2 小时前
C 语言 数组删除指定元素(快慢指针法)
c语言·数据结构·算法
心中有你02142 小时前
【路径规划】A*寻路算法最通俗易懂讲解(C语言完整实现+详细注释)
c语言·开发语言·算法
YYYing.2 小时前
【设计模式系列 (七) 】桥接模式
c++·后端·设计模式·桥接模式