A5092 蜈蚣

暂无评定 传统题 上传者
时间限制3000ms
内存限制256MiB
通过 / 提交2/8

A5092蜈蚣

暂无评定 传统题 上传者
时间限制3000ms
内存限制256MiB
通过 / 提交2/8

蜈蚣(异或和划分)

题目描述

一条蜈蚣有 nn 节,第 ii 节的权值为 aia_i。现在要将它切成恰好 mm 段。

每段至少包含一节,且必须由原蜈蚣中连续的若干节组成。所有节都要被分配,不能遗漏,也不能重复使用;相邻两段之间不需要留出空隙。

一段的价值等于其中所有权值的按位异或和。例如,区间 [l,r][l,r] 的价值为:

al⊕al+1⊕⋯⊕ar.a_l\oplus a_{l+1}\oplus\cdots\oplus a_r.

其中 ⊕\oplus 表示按位异或,在 C++ 中对应运算符 ^。

求这 mm 段的价值之和的最大值。

输入格式

第一行两个整数 n,mn,m,分别表示总节数与需要划分的段数。

第二行 nn 个整数 a1,a2,…,ana_1,a_2,\ldots,a_n,表示各节的权值。

输出格式

输出一个整数,表示恰好划分为 mm 段时,各段价值之和的最大值。

样例 1

5 3
1 2 3 4 5
15

样例解释

一种最优方案为 [1, 2]、[3, 4]、[5],价值分别为 1⊕2=31\oplus2=3、3⊕4=73\oplus4=7、55,总和为 1515。

样例 2

2 1
1 1
0

样例解释

必须恰好分成一段,其价值为 1⊕1=01\oplus1=0,不能拆成两段得到 22。

数据范围与评分

对于所有测试数据,1≤n≤10001\le n\le1000,1≤m≤min⁡(n,100)1\le m\le\min(n,100),1≤ai≤230−11\le a_i\le2^{30}-1。保证最终答案不超过 230−12^{30}-1。

测试组 分值 附加限制
1 20 分 n≤20n\le20,m≤5m\le5
2 30 分 n≤100n\le100,m≤10m\le10
3 50 分 无

各组独立计分,组内全部测试点通过才能获得该组分数。

来源

根据洛谷 P5144「蜈蚣」整理,评分分组为本训练题配置。