<span>省选模拟71 题解</span>

A. 王子

这个数据范围加上很奇怪的限制,其实就应该是网络流了。

可以首先钦定选择了 $A$ 类,然后将其中的一些替换为 $B$ 类。

其实与志愿者招募那个题挺像的,只不过原来是对于每个点选择 $[l,r]$ 个区间。

但是现在的问题是要求每个区间选择 $[l,r]$ 个数点。

其实并不难处理,将 $n-k+1$ 个区间视作 $n-k+2$ 个连成一条链的点之间的边即可。

这样每个点能造成的贡献其实就是一段连续区间,与志愿者招募一题很像了。

但是还有一个问题是,在本题中要求最大的收益,但是直接建图是存在正环的。

所以这个最大费用流就没得跑了。

考虑这样一个事情,一般的上下界网络流是钦定下界,然后去流上界-下界。

其实另一种做法是钦定上界,建反向边同样流上界-下界表示退流。

这样的话其实可以结合两种做法,只建负边权的边就可以解决这个问题。

 

B. 遇见

这个题的 $n^2$ 做法是显然的,然后发现 $n \leq 30000$ 而且时限还开了 $3s$。

那直接打个暴力,顺便卡卡常就结束了。

正解是考虑给每种数随机一个权值,然后区间 $[l,r]$ 成为答案仅当 $sum_r \oplus sum_{l-1} \oplus s_{l,r}=0$。

其中 $sum_i$ 表示前缀异或和,$s_{l,r}$ 表示 $[l,r]$ 区间内出现的数的异或和。

容易发现这是一个 $0/1\ trie$ 树问题,然后难点在于维护后者。

考虑每次移动右端点,更新可以更新的 $s_{l,r}$,这是一段连续的区间并且左端点是容易找到的。

所以分块维护这个 $0/1 \ tire$ 树,每次打个标记就好了。

 

C. 字符串

显然这个问题要用 AC 自动机解决,然后发现不会做。

看数据范围,有一个很奇妙的性质是点数 $\leq 50$。

加上循环这个玩意,就可以联想到这个东西一定是存在循环节的。

假设当前 $str$ 的长度为 $len$,那循环节的长度一定不超过 $50*len$。

所以暴力找循环节是可以接受的。

部分分提示了一些东西,比如可以用一个珂朵莉树来维护字符串 $S$。

点数 $\leq 50$是一个很好的东西,还有一个可以挖掘到的性质是 tire 树的深度是 $\leq 50$的。

因为 AC 自动机维护的是后缀,那也就是说对于每次我们只关注每个点的前 $50$ 个字符就足以得到当前状态。

考虑维护一个数组 $f$, $f_i$ 表示把 $S[1:i]$ 丢到自动机上匹配,得到的以 $r$ 为右端点的子串个数。

对于每次修改,只需要考虑循环节、循环节之前的部分、 $r$ 之后的不超过 $50$ 个字符。

对于循环节内的部分,用线段树区间覆盖即可维护。另外两者可以直接暴力。

对于每次询问,只需要将 $[l,r]$ 拆分为 $[l,l+50]$ 和 $[l+51,r]$。

前者长度很小,可以暴力维护。后者已经与左端点 $l$ 无关了,所以可以直接用 $f$ 数组,所以这题就做完了。

全部评论

相关推荐

oppo 应用软开 22*15+0.5*12
拿到了ssp完美:真的坎坷,但是你至少拿到这么多offer了!
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务