(题解按照难度排序)
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)$
如果您不会线段树,没关系,我们分块也是有一个优秀的根号复杂度的