小Q的无敌异或 -- 所有区间的异或和

给定一个长度为n的非负整数序列{An},求序列的所有子区间异或值之和模998244353,和所有子区间之和的异或值。
n≤105,Ai≤106。

题解:
先考虑第一问。
令xor(i)表示前i项的异或值,xor(l,r)表示第l项到第r项的异或值,那么xor(l,r)=xor(r)⊕xor(l−1)。
考虑xor(l,r)的二进制第k位是1的可能情况,当且仅当xor(r)和xor(l−1)的二进制第k位不同。
那么我们可以固定右端点r,算出有多少个l使xor(l,r)的第k位是1,假设已经算出右端点为r的答案,现在可以O(1)推到右端点为r+1的答案,因为对于r+1来说新增的l只有r+1一个,只需要O(1)将贡献产生即可。时间复杂度O(nlogA)。
Mycode:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
int sum[maxn],a[maxn],c[maxn];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值