自主学习笔记类产物
“今年欢笑复明年,秋月春风等闲度。”——《琵琶行》
——————————————————————————————————————————
失配树
感觉今天下午是状态最差的一个下午了。
这道题目的思路是这样的:
我们需要通过套nxt去枚举出每一个前缀的所有border。这些border会组成一条链。
而一堆链会组成一棵树。
我们来描述一下这颗树的形态:树有很多个分支,每一个叶子节点都是一个前缀的长度,对于x,它的父亲节点编号会是:nxt[x-1](关于为什么x-1:因为string从0开始)
当然这并不代表一共会有n条链,因为一个前缀有可能既是前缀又是border。
我们要找两个前缀的最长公共border,很容易就能联想最近公共祖先。
所以我们只要求lca(p,q)即可。
另:叶子节点都只是前缀,而不是Bourdor。
代码实现会有一点点问题,我先把AC的贴一下:
是这样的:注意到我只加了一条单向边。
如果加双向边2e6的数据会因为vector使用和其他预处理相关操作TLE
https://www.xinyoudui.com/ac/contest/747011272000BED0906D45/problem/8276
这道题是一个在kmp基础上修改一丢丢的板子题。但是我挂了点分,所以我把它弄出来写一下会错的点。注意到这是我的代码:(它是正确的)
要点:q=-1(这是因为i-j可能等于0,如果将q初始化为0它就不会计算这种情况)
https://www.luogu.com.cn/problem/P4551
这道题的思路是:将n个节点道根节点的路径异或值全部记录到一个数组中,然后用这个数组中所有数的二进制建trie树,再用贪心思想:对于每个数都尽量找与当前相反的路径(0找1,1找0)
放一下代码: