本题要求算所有子串的权值和。我们发现:所谓的权值是由子串中数字种类多少决定的。我们可以将一种数字对所在子串的权值影响称为“贡献”。一种数字如果在一个子串出现多次,只有第一次出现的有贡献。子串中的数字对子串贡献只有对从其往后有贡献,其实就是一个等差数列求和。我们可以总结:只要一一算出每个数的贡献就可以得出答案。这里最重要的是要标记一个数在其前面出现的位置。我们可以从前往后遍历,用一个数组遍历每个数在前面出现的位置,最后每个数的总贡献==(该数字的位置-前一次出现次数的位置+1)(总个数-此位置+1+1)(总个数-此位置+1)/2。

京公网安备 11010502036488号