(这次的代码写得非常的丑,因为敲代码时的环境非常的乱,大家可以不用看了。。。。。。)
题目大意:
给一个数字串。
然后定义一个函数Mex({A}) = A中没有的最小的非负整数。
即若A = {0、1、3},则Mex(A) = 2
然后要求数字串的所有连续子串的Mex值之和。
总结:
这一题我想了很久。这一题的解放真是太有意思了,处于我思维的一个盲点。
我一开始想过处理出Mex = 1、2、3、.......、n-1、n 的子串数,然后统计答案。
然后我从另外一个方向想:
依次去统计
[n, n]
[n-1, n-1] , [n-1, n]
[n-1, n-2] , [n-2, n-1] , [n-2, n]
......
[1 , 1] , [1 , 2] , [1 , 3] , [1 , 4] , [1 , 5] , ..... , [1, n-1] , [1 , n]
然后[i, x] 到[i-1, x] ,用什么数据结构去维护。
从这个方向去想也一直没有结果,后面看了网上的题解,才发现原来还能够这么做。
做法是先用O(N)的时间计算出[1, 1] , [1 , 2] , [1 , 3] , ...... , [1 , n-1] , [1 , n] 的值
然后在其基础上,用O(logn)的时间复杂度计算出
[2, 2] , [2, 3] , [2 , 4] , ....... , [2 , n-1] , [2 , n]的值。
这样转换n次,就能算出所有连续子串的合,并且时间复杂度是O(N*logN)
具体做法:
先用O(n)的时间计算出[1, 1] , [1, 2] , [1,