2022牛客多校第3场
战况

整体来看没有前几次的好,今天的字符串题目 $H$ 我也没有写出来。
补题
H-Hacker
题意
给出长度为 $n$ 的小写字符串 $A$ 和 $k$ 个长度为 $m$ 的小写字符串 $B_1 … B_k$ , $B$ 的每个位置拥有统一的权值 $v_1 … v_m$ ,对于每个 $B_i$ 求最大和区间满足该区间构成的字符串是 $A$ 的子串(空区间合法)。
思路
首先用给字符串 $A$ 建立一个后缀自动机
之后对于每个字符串 $B_i$ ,通过在后缀自动机上匹配的方法进行对 $B_i$ 的匹配,对于 $B_i$ 的每个位置 $j$ ,求以 $B_{ij}$ 为结尾的在 $A$ 中出现过的最长后缀的最大区间和,每一次取 $max$ 值,遍历完一个串之后就是这个串的 $ans$ 。
代码
1 |
|
总结
在 $SAM$ 中不一定非要把每个字符串都加到 $SAM$ 中才能进行子串匹配
在这道题中就是只对原串 $A$ 建立了 $SAM$ ,然后对于每一个新串,通过 $trie树$ 的匹配方式进行匹配即可。
J-Journey
题意
给定一个城市有若干十字路口,右转不需要等红灯,而直行、左转、掉头都需要等红灯,求从起点的路到终点的路最少等多少次红灯。
思路
把城市中的每条路当成一个节点,把每个十字路口进行的四种操作当成边,建图,直接 $dijkstra$ 即可解决。
或者也可以不建图,可以直接在 $dijkstra$ 进行顶点转移的操作,最后达到的效果是一样的。
还有一种做法, $bfs$ ,具体原理和上面类似,不再赘述。
代码
1 |
|
总结
我当时是图建错了,然后当时 debug 了好久都找不出来是怎么回事,事后才发现是图建错了,但是仍然没找到为什么会错。
之后我放弃了建图的想法,直接在 $dijkstra$ 中进行顶点的转移操作。
在算法没错的情况下,可以尝试考虑是不是图建错了。