蓝桥杯【第十一届】【省赛】【B组】

本文探讨了平面切分问题,指出每增加一条直线如何影响平面数量,并解释了为何在计算子串分值时,长度乘积公式使用的是`(i-last[s[i]-'a'])*(n-i+1)`。这个细节涉及到空集的可能性,确保不遗漏任何可能的子串组合。同时,文章介绍了优化算法,避免了暴力求解,显著提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平面切分

​​​​​​“蓝桥杯”练习系统

每增加一条直线,若与其他直线不产生交点,会产生另外一个平面;若产生交点,多贡献的平面个数由产生交点的个数确定。

细节问题:别忘最后加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以及一个∅,这样组合起来恰好是所有可能子串!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值