2025 异或和 · 方案二 动态规划加值域数组
best 数组记下每个前缀异或值的最优 dp
正文
// CSP-J 2025 复赛 T3 · 异或和(方案二)
// 原题:https://oj.yecheng.tv/p/CSP2025JC
//
// 方案二 · 动态规划 + 值域数组(写法更严谨,也更快)
// 同样用前缀异或 s[i]。定义 dp[i] = 只在前 i 个数里选,最多能选几个区间。
// 转移只有两种:
// 不用第 i 个:dp[i] = dp[i-1];
// 用第 i 个收尾:选一个区间 [j+1, i],要求 s[j] == s[i] ^ k,此时 dp[i] = dp[j] + 1。
// 关键是第二种怎么快速求:用一个 best[v] 记下「在所有 s[j] == v 的位置里,dp[j] 最大是多少」。
// 因为 dp 是单调不减的,取最大的 dp[j] 一定最优,于是每个位置只要 O(1)。
// 注意顺序:先用 best 算 dp[i],再把 dp[i] 并进 best[s[i]],这样保证 j < i。
// 值域:k 和所有 a[i] 都小于 2^20,前缀异或也小于 2^20,直接开数组不用哈希。
// 复杂度 O(n + 2^20)。
#include <bits/stdc++.h>
using namespace std;
const int MAXV = 1 << 20;
const int NEG = -1000000000;
int best[MAXV];
int dp[500005];
int main() {
freopen("xor.in", "r", stdin);
freopen("xor.out", "w", stdout);
int n;
int k;
cin >> n >> k;
for (int v = 0; v < MAXV; v++) best[v] = NEG;
best[0] = 0; // j = 0:一个区间都没选,dp 为 0
int s = 0;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
s ^= x; // s = s[i]
dp[i] = dp[i - 1]; // 不选以 i 结尾的区间
int need = s ^ k; // 需要一个 s[j] == need
if (best[need] != NEG) dp[i] = max(dp[i], best[need] + 1);
best[s] = max(best[s], dp[i]); // 位置 i 也可以当以后的起点
}
cout << dp[n] << "\n";
return 0;
}
CSP-J 标程 · 复赛真题的其它内容
- 2019 数字游戏 · 方案一 逐字符统计
- 2019 数字游戏 · 方案二 二进制位运算
- 2020 优秀的拆分 · 方案一 贪心从大到小减
- 2020 优秀的拆分 · 方案二 直接看二进制位
- 2021 分糖果 · 方案一 枚举每个 k
- 2021 分糖果 · 方案二 看余数在哪一段
- 2022 乘方 · 方案一 边乘边判断
- 2022 乘方 · 方案二 快速幂加封顶
- 2023 小苹果 · 方案一 照规则真模拟
- 2023 小苹果 · 方案二 只盯住两个数字
- 2024 扑克牌 · 方案一 用集合去重
- 2024 扑克牌 · 方案二 二维布尔表
- 2025 拼数 · 方案一 收集后降序排序
- 2025 拼数 · 方案二 桶计数
- 2019 公交换乘 · 方案一 暴力匹配
- 2019 公交换乘 · 方案二 时间窗口优化
- 2020 直播获奖 · 方案一 每轮排序
- 2020 直播获奖 · 方案二 桶计数
- 2021 插入排序 · 方案一 每次真排一遍
- 2021 插入排序 · 方案二 增量维护有序表
- 2022 解密 · 方案一 二分求整数平方根
- 2022 解密 · 方案二 先估后校开方
- 2023 公路 · 方案一 朴素贪心
- 2023 公路 · 方案二 单调栈预处理
- 2024 地图探险 · 方案一 四方向分支写
- 2024 地图探险 · 方案二 方向数组
- 2025 座位 · 方案一 把座位表填出来
- 2025 座位 · 方案二 直接算排名
- 2019 纪念品 · 方案一 逐天完全背包
- 2019 纪念品 · 方案二 砍掉不赚钱物品
- 2020 表达式 · 方案一 每次重算后缀式
- 2020 表达式 · 方案二 建树加关键性传播
- 2021 网络连接 · 方案一 手写解析
- 2021 网络连接 · 方案二 读入后回拼校验
- 2022 逻辑表达式 · 方案一 递归分治
- 2022 逻辑表达式 · 方案二 递归下降
- 2023 一元二次方程 · 方案一 照公式逐步写
- 2023 一元二次方程 · 方案二 拆成小函数
- 2024 小木棍 · 方案一 先定位数再贪心
- 2024 小木棍 · 方案二 预处理最小数字表
- 2025 异或和 · 方案一 贪心能接就接
- 2019 加工零件 · 方案一 递归加记忆化
- 2019 加工零件 · 方案二 奇偶最短路
- 2020 方格取数 · 方案一 深搜回溯
- 2020 方格取数 · 方案二 按列动态规划
- 2021 小熊的果篮 · 方案一 每轮扫一遍
- 2021 小熊的果篮 · 方案二 链表加有序集合
- 2022 上升点列 · 方案一 先只考虑不加点
- 2022 上升点列 · 方案二 二维动态规划
- 2023 旅游巴士 · 方案一 分层图加优先队列
- 2023 旅游巴士 · 方案二 状态压成一维
- 2024 接龙 · 方案一 按定义广搜
- 2024 接龙 · 方案二 滑动窗口逐轮推进
- 2025 多边形 · 方案一 枚举所有子集
- 2025 多边形 · 方案二 排序加计数 DP