提高班作业(第一次课)笔记
哈希
P2312
观察到范围不大,考虑枚举解。
对于一个解,比较直接的想法是代入解看是否等于 0,数太大了,所以只要把结果取模看是否为 0 即可。
模数取两个即可。
CF985F
对于同构问题就看对应关系,即对于每个字母找到一个对应字母在另一个字符串中出现的位置一样。
那么我们把查询的两个串中每个字母对应的位置处理出来,看看能不能匹配上,位置的信息做个哈希即可。
然后考虑匹配的话两个排个序看看能不能配上即可。
P8819
首先考虑yes/no的条件,既然每个点出度都为 0,那么显然是若干个内向基环树,显然每个点都可以走到所在内向基环树的环里,所以第二个条件是不用考虑的。
接下来考虑第二个。既然每个点出度为 1,我们考虑维护每条边的出发点,那么出度都为 1 等价为出发点的可重集为 1 到 n。
梳理一下,现在需要维护一个可重集做到维护题目中的哪些操作。
看起来十分的不好维护,但是因为我们每次只是比较两个集合(当前集合,目标集合1-n),所以可以考虑哈希。
判断两个集合是否一样典的不能再典了,常见的题:https://atcoder.jp/contests/abc367/tasks/abc367_f
于是我们给每个点都随机赋权,然后判断和是否相当即可。
字典树
P2580
直接map即可
我们把给出的所有字符串插进字典数,然后查的时候再树上跳一跳就行了。是个板子题。
P9753
这里我们不好快速判断某个连续串是否满足条件,这是个棘手的问题,如果我们不解决这个问题最快只能做到 n^2 级别,具体做法是枚举左端点然后往右扫做栈消除。
于是我们打开了题解
结论:若对 [1,r] 进行栈消除后剩下来的数和 [1,l-1] 进行栈消除剩下来的数一样,那么 [l,r] 一定可以消除。
感性证明一下,假设现在已经对 [1,l-1] 进行了栈消除,结果对 [l,r] 做了以后里面的东西没变,那么肯定是 [l,r] 是可以消除的自己里面消了.
那么我们对所有前缀做一下,然后看看有多少对相同的,用 map 统计一下,就得到一个 nlogn 的解法了,运用一点手法可以通过。
我们有什么方法可以快速统计之前某个串的出现次数呢?字典数!
因为每次我们最多在树上移动一次,所以单次复杂度 O(1) 且节点个数最多 n 个,可以通过本题!

浙公网安备 33010602011771号