最失败的一集。
T1
将每个字符串内部的字符按照大小排序,从小到大和从大到小,然后前后缀维护一下其它串倒序的最小串,与当前串的正序比较一下即可。
T2
先模拟出最后每个 $x’_i$ 与原来 $x_j$ 或 $T,F,U$ 的关系,然后用扩展域并查集判断即可。
T3
个人感觉出的最好的一题,也是最有意思的一道题。
考虑到底要求什么。若 $x_i
非常关键的一点是注意到奇怪的特殊性质,并且给了 70pts。不难联想到与正解可能有很大的关联。
考虑特殊性质,容易发现我们可以用 $x_n$ 覆盖 $y$ 一段后缀,或者用 $y_m$ 覆盖 $x$ 的一段后缀。考虑这样的一个算法:从前往后不断尝试用 $y_j$ 覆盖 $x_i$,如果不匹配的话那么将 $i$ 前移直到遇到第一个匹配的为之。这样做是线性的。
再考虑一般情况,很容易想到,将 $x$ 按照最小值 将 $y$ 按照最大值分别分为两部分,前面一段正着做,后面一段倒着做,那么就可以直接套用特殊性质的解法。最终的时间复杂度为 $\mathcal O(nq)$。实际代码比较简洁。
T4
傻逼DP,首先设计出状态 $f(i,j)$ 表示到第 $i$ 天时已经连续打卡了 $j$ 天,这样做前缀 max 一下是 $\mathcal O(n^2)$ 的。尝试优化,但是发现不太方便,于是重新设计状态 $f(i,j)$ 表示 第 $j$ 天到第 $i$ 天连续打卡。这样就很容易用维护区间加,求区间 max 的线段树维护了,时间复杂度 $\mathcal O((n+m)\log n)$。最后离散化一下就可以得到 $\mathcal O(m\log m)$ 的算法。