首页 > 试题广场 >

子数组异或和为0的最多划分

[编程题]子数组异或和为0的最多划分
  • 热度指数:1469 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个整型数组arr,其中可能有正有负有零。你可以随意把整个数组切成若干个不相容的子数组,求异或和为0的子数组最多可能有多少个?整数异或和定义:把数组中所有的数异或起来得到的值。

输入描述:
输出包括两行,第一行一个整数,代表数组长度n。第二行有n个整数,代表数组arr


输出描述:
输出一个整数,表示数组切割最多的子数组的个数。
示例1

输入

10
3 2 1 9 0 7 0 2 1 3

输出

4

说明

最优划分:{3,2,1},{9},{0},{7},{0},{2,1,3} 其中{3,2,1},{0},{0},{2,1,3}的异或和为0

备注:
时间复杂度,空间复杂度
头像 星晨
发表于 2020-11-15 14:23:49
如果一段连续子数组异或和为0 边界两端的异或和必然相等 如:arr[i~j ] 异或和为为0 则至少说明 【-i)异或和 等于 【0-j) 异或和我们假设dp[i] 标示 0-i 的所求,则我们按照异或和维度存储下来一份映射关系 mapTmp[eor] = i eor => idp[i] 展开全文
头像 快支棱起来的椰子很愤怒
发表于 2022-01-18 13:08:59
n = int(input()) nums = list(map(int, input().split())) dp = [0] * n before = {0: -1} before[nums[0]] = 0 dp[0] = 0 if nums[0] != 0 else 1 eor = nums[ 展开全文