题目
给定你长度n=5000的数组A, 【0 <= A[] < 2048】,你可以将任意元素替换成任意数字
给定k <= n,要求你所修改后的数组B 满足: 所有长度为k的连续区间,其异或和为0
问你最少需要修改几个元素
A = [1, 2, 3, 1, 2, 3] k = 3
所有的子区间为[1,2,3] [2,3,1] [3, 1, 2] [1, 2, 3],其异或和均为0
所以,ans = 0
这个问题是非常非常复杂的,如果没找对思路的话
首先我们要关注的,其实并不是“异或”这个问题,而是“所有长为K的区间”这个问题
必须从这一点入手!!!
1,给定一个数组【1, 2, 3, 4, 5, 6, 7, 8】 k=3
'只要涉及到「所有长度为k,的连续区间」问题,就一定要想到: '
' 这个问题,是有一个 非常奇妙的性质!!! '
我们观察:[1,2,3] [2,3,4] [3,4,5] [4,5,6]
/ 任意相邻的两个区间,他们有(k-1)个元素,都是完全相同的!!
/ [1,2,3] 和 [2,3,4],他俩 只有1和4是不同的!!!
/ 而又有: (A1^A2^A3) = 0 = (A2^A3^A4), 所以有: A1 = A4 !!!
/ 该题要求的是“所有区间的 异或和 相同”,其实 如果他要求是 “累加和”“累乘和”等等
/ 只要满足交换律,其实 你都得到 非常关键的信息 “A1 == A4“
/ '即,任意两个相邻的长K区间,他们只有1个元素是不同的,其余都相同'
当然,不仅这一个性质,从这个性质 可以推出更重要的性质:
由”A1 == A4",你必须要非常敏感的察觉到,A1 = A4 = A7 = A10 = ...
/ 这才是本题的关键: "A1 = A1+K = A1+2K = A1+3K = ..."
此时,假如说 我们由最初的A数组,得到最终的答案数组B,则这个B 一定满足:
1, B1 == B1+k == B1+2K == B1+3K == ....
我们根据这个性质,将B数组 分为 K个组
比如B = [1,2,3,4,5,6,7,8] , K=3
第1组: [1, 4, 7] '同一组的所有元素,均相同!!!'
第2组: [2, 5, 8]
第3组: [3, 6]
比如拿第1组[1,4,7]来看,你很容易会想到:
因为B1=B4=B7=T, 我们令T = (A1, A4, A7)的众数
这样,就可以 修改最小的元素,从而形成ans
'你非常容易会这样去想!!!'
但不要忘记,每个组的元素相同 这一性质
仅仅是从 "所有长为K的区间" 其异或和相同, 推来的
即,只要是“所有长为K的区间”异或和相同,你就可以得到: A1=A4=A7=A10=...
但,本题中 还有一个要求“即,不仅异或和相同,而且这个异或和的值 为0!!“
'也就是说: 你还要保证: B1 ^ B2 ^ B3 == 0 !!! '
' 注意, B1 = B4 = B7 同一组的值 都相同的'
2, 如何去保证”B1 ^ B2 ^ B3 == 0“这一性质呢??
其实称为B1 不太合适, 因为B1 其实不仅代表B1,还代表第1组的值
因为,第1组 所有的B值 都是相同的
我们令, G1 = B1 = B4 = B7 = B10 = .