模拟47 题解

A. Emotional Flutter

显然第一步的位置只有k种不同的取值。

前缀和对步长k取模,那么每条黑线限制的是一段连续区间。

问题是是否完全限制k个位置。

第一个思路是动态开点线段树,想了想,害怕卡空间,没打。

之后的想法是将每条线段离线下来,对线段的左右端点和两条线段之间的区域离散化,

直接用差分数组表示覆盖次数,如果存在覆盖为0的位置则有解。

更好的思路是直接贪心求解。

将所有线段按左端点排序,不断对右端点取max,如果右端点的max小于当前左端点,那么存在解。

 

 

 

B. Endless Fantasy

询问子树的众数,直接线段树合并就完了。

 

 

 

C. 字符消除2

本题可以简化为:

给定字符串s,求一个字典序最小的01串使得该01串的循环节个数及长度与原串相同。

如果对字符串做kmp,那么不断对n翻next,即可取得所有的循环节。

只要保证01串的n的每一个next都与原字符串相同即可。

将翻到的next放在一个数组里。

考虑从小到大处理每个可能的next,分类讨论两种情况:

1.该next小于等于前一个next乘2。

   那么显然要将前一个next的后缀接在后面,保证该next的next恰为前一个next。

2.该next大于前一个next乘2。

 比较好的性质是该情况不会出现超过logn次,考虑等差数列的性质,对这些next求和只有n级别。

   还是将前一个next所表示的字符串接在最后,以保证该next的next可以为前一个next。

   对于中间空出来的部分:

   暴力不断向前翻next,如果可能存在不合法的情况,为保证字典序最小,将中间的最后一个位置设为1。

转载于:https://www.cnblogs.com/skyh/p/11557600.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值