如果一段连续子数组异或和为0 边界两端的异或和必然相等
如:arr[i~j ] 异或和为为0 则至少说明 【-i)异或和 等于 【0-j) 异或和
我们假设dp[i] 标示 0-i 的所求,则我们按照异或和维度存储下来一份映射关系
mapTmp[eor] = i eor => i
dp[i] = dp[map[eor]]+1
dp[0] = arr[0] == 0?1:0
最后我们是求最大,dp[i] = max(dp[i-1],dp[i])
package main import ( "fmt" "os" "bufio" "strconv" ) func main(){ var n int fmt.Scanf("%d",&n) arr := make([]int,n) scanner := bufio.NewScanner(os.Stdin) scanner.Split(bufio.ScanWords) for i:=0;i<n;i++{ scanner.Scan() arr[i],_ = strconv.Atoi(scanner.Text()) } helper(arr,n) return } func helper(arr []int, n int){ dp := make([]int,n) mapTmp := make(map[int]int) mapTmp[0] = -1 //mapTmp[arr[0]] = 0 eor := 0 if arr[0] ==0 { dp[0] = 1 } for i:=0;i<n;i++{ eor ^= arr[i] //发现再次出现 if val,ok := mapTmp[eor]; ok{ if val == -1 { //说明上次出现的位置在首位 dp[i] = 1 }else{ //说明当前值应该基于上一次出现的值的位置 +1 dp[i] = dp[val] +1 } } mapTmp[eor] = i //与前一个值相比,得到最大值 if i!=0 && dp[i] < dp[i-1]{ dp[i] = dp[i-1] } } fmt.Println(dp[n-1]) }