平面切分
每增加一条直线,若与其他直线不产生交点,会产生另外一个平面;若产生交点,多贡献的平面个数由产生交点的个数确定。
细节问题:别忘最后加1,意为初始平面数。
子串分值和
暴力:从左向右以第i个字母为基准,循环加入后方字母,通过set维护不同字母个数,答案为循环加入后set的大小之和。
标解:可以将一个字母对包含其的子串的贡献度记为1,则可以发现若有重复字母,那么它的贡献度已经在以前一个相同字母左右扩展出的子串中被计算过一遍了,所以在第二次出现该字母时,只需要计算以当前字母向左扩展至前一个相同字母的位置之前、向后扩展至末尾的子串。而向两边扩展的长度的乘积即为最终贡献的子串数量。过程中,维护上一次该字母出现的位置即可。
细节问题:为啥两边扩展的长度乘积中:
(i-last[s[i]-'a'])*(n-i+1)
// i表示当前遍历到的字符串位置(以1开头),last为上一次相同字母出现的位置,n为字符串总长度
后面是n-i+1呢?不应该是n-1吗?答案就是:因为其实后方包含了一个空集的可能!比如ababc,第一个b处的组合其实是以b向左扩展的子串b,ab和向右扩展的子串(不包含b)a,ab,abc以及一个∅,这样组合起来恰好是所有可能子串!