胡策题解

(题解按照难度排序)

T2 度杂复间时

题意:在字符串$s$中$q$次询问给定的字符串$t$是否能在两处匹配到

ps:这是一道语文题...

算法1 我会随机!

随机输出Yes/No

时间复杂度:$O(q)$

期望得分:???

算法2 我会kmp!

对于考场上忘了AC自动机怎么写的同学们,依然可以通过kmp拿到可观的分数

具体做法就是对每个$t$串求出$fail$数组(您们可能叫$next$数组?)

然后一个一个匹配看能不能匹配到两次

时间复杂度:$O(q \cdot (|s| + \sum |t|))$

算法3 我会AC自动机!

把询问离线,将所有询问串建立AC自动机

将s在上面跑看有多少可以匹配到两次

标程使用了良好的AC自动机写法

这无疑是良心出题人无私的馈赠

学过AC自动机的人可以快速AC掉这道题

而没学过AC自动机的人也可以通过标程得到知识的长进

出题人希望通过这道题给大家信心让大家AK这套题AKnoip AKNOI AKWC AKCTSC AKIOI

成为比肩Tourist的大神

T1 惑疑的凯小

算法1

虽然算法1并没有分,但它是我们接下来思考的基础

首先我们考虑所有$k_i$都为$1$的情况

这显然是大家暑假刷的前几道水题之一

做法就是把区间按右端点升序排序

贪心选不矛盾的

算法2

依然按照右端点升序排序

我们可以证明,排序后在每一个点把人装满是最优决策

那么我们用一个数组$NTR_i$来记录$i$点车上最多有多少人

每到一个点,我们检查它最多能装多少人

如果对于任意$j$∈$[x_i,y_i]$ , $k_i + NTR_j$都不超过$m$

那就全装进去

否则我们把车装满,也就是选$[x_i,y_i]$中最大的$NTR_j$

然后在这里装$m - NTR_j$就可以了

每次操作之后更新$NTR$数组

这就是一个区间修改,区间查询最大值

每次暴力NTR的话是$O(n^2)$的

用线段树NTR的话是$O(nlogn)$

如果您不会线段树,没关系,我们分块也是有一个优秀的根号复杂度的

                                         

猜你喜欢

转载自www.cnblogs.com/Kong-Ruo/p/9396362.html