视频加载失败

安吉D17 T1

778 字
4 分钟
安吉D17 T1
原题呈现

P3917 异或序列#

题目描述#

给出序列 A1,A2,,ANA_1,A_2,\cdots,A_N,求

1ijNAiAi+1Aj\sum_{1\le i\le j\le N} A_i\oplus A_{i+1}\oplus\cdots\oplus A_j

的值.其中,\bigoplus 表示按位异或.

输入格式#

第一行,一个整数 NN

第二行,NN 个整数 A1,A2,,ANA_1,A_2,\cdots,A_N

输出格式#

一个数,为表达式的值.

输入输出样例 #1#

输入 #1#

2
1 2

输出 #1#

6

说明/提示#

  • 对于 60%60\% 的数据,1N1031 \le N \le 10^3
  • 对于 100%100\% 的数据,1N1051 \le N \le 10^50Ai1090 \le A_i \le 10^9

我们知道,按位异或具有位独立性,即位与位之间的运算是独立的,因此可以按位计算贡献.

对于子串贡献题,最常见的是使用 dp,定义 dp[i] 表示以第 ii 个数结尾能够做出的贡献.由于异或具有位独立性,因此,对状态稍作修改,定义状态 dp[i][j] 表示只考虑每一个数的第 jj 位,以第 ii 个数为结尾的子串中异或和为 1 的数量.即若设 si,js_{i,j} 表示 sis_i 的第 jj 位,则 dpi,jdp_{i,j}ki\forall k \leq i,满足 sk,jsk+1,jsk+2,jsi,j=1s_{k,j}\oplus s_{k+1, j}\oplus s_{k+2, j}\cdots \oplus s_{i,j}=1kk 的数量.

这样就可以开始 dp 了,对于每一位 jj,初始状态为 dp1,j=s1,jdp_{1, j}=s_{1,j},接着,遍历每一个数,设遍历到第 ii 个数,则:

  • si,j=0s_{i, j}=0
    • 对于以 ii 结尾且长度为 1 序列,其异或和为 0,故对答案没有贡献.
    • 对于以 ii 结尾且长度为 k,k>1k,k>1 的序列,其异或和为不会发生改变,因此原来以 i1i-1 结尾,长度为 k1k-1 的序列异或了 0 之后值仍不变.因此,这种情况对答案的贡献就是以 i1i-1 结尾的序列中异或和为 1 的序列数量.
    • 因此存在转移方程:dpi,j=dpi1,jdp_{i, j}=dp_{i-1, j}
  • si,j=1s_{i,j}=1
    • 对于以 ii 结尾且长度为 1 序列,其异或和为 1,对答案贡献为 1.
    • 对于以 ii 结尾且长度为 k,k>1k,k>1 的序列,其异或和会改变,因此原来以 i1i-1 结尾,长度为 k1k-1 的序列异或了 1 之后原来是 1 的会变成 0,原来是 0 的会变成 1.因此,这种情况对答案的贡献就是以 i1i-1 结尾的序列中异或和为 0 的序列数量.使用总序列数量 i1i-1,减去为 1 的序列数量 dpi1,jdp_{i-1,j} 即可.
    • 因此存在转移方程:dpi,j=i1dpi1,j+1=idpi1,jdp_{i,j}=i-1-dp_{i-1,j}+1=i-dp_{i-1,j}

对于答案,我们需要统计以每一个数结尾的子串每一位的贡献,即:

i=1nj=031dpi,j×2j\sum_{i=1}^n\sum_{j=0}^{31} dp_{i,j}\times2^j

可以写出标程.由于 dpi,jdp_{i,j} 只与 dpi1,jdp_{i-1,j} 有关,故可以把 dpdp 数组变成一个变量 ans 以达到节省空间的效果,以下标程实现了这个效果.

标程

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e6 + 100;
int a[N], ans;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 0; i < 32; i++) {
int now = (a[1] >> i) & 1;
ans += now * (1 << i);
for (int j = 2; j <= n; j++) {
if (a[j] & (1 << i)) {
now = j - 1 - now + 1;
}
ans += now * (1 << i);
}
}
cout << ans;
return 0;
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

安吉D17 T1
https://blog.jerrylab.top/posts/problem/anji2026/D17/T1/
作者
Jerry
发布于
2026-08-17
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Jerry
Hello, I'm Jerry.
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
最新动态
站点统计
文章
80
分类
3
标签
35
总字数
89,198
运行时长
0
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.16.5
文章许可
CC BY-NC-SA 4.0