01 2019 档案
摘要:"传送门" 今天终于找到了一种比较方便好懂的用LCT维护生成树的办法。 以前用的方法……不是很理解,然后我写在这道题的时候还错了…… 首先先看一下这道题。这很明显就是让我们动态的维护一个最小生成树。不过因为删边的过程很难维护,所以我们改成先把边存起来,之后倒序回加。 一开始我们先用LC
阅读全文
摘要:"传送门" 突然发现自己不大会维护位置这种题……学习了一下。 具体的操作还是使用实现。什么split,merge都一样。问题是如何求位置。 首先我们在读入的时候,保存每个节点的权值和下标,并且按照权值进行排序,同时把它插入到一棵中。 之后我们怎么查找一个节
阅读全文
摘要:"传送门" 我还是没有逃过在这道题上debug好久的命运…… 我是使用来做的这道题。写的时候写的挺爽的……调的时候真难受。 首先我们先来说说咋做吧。前5个操作对于来说不在话下,只要多打两个标记就可以了。但是如何求最大子段和? 我们一般只会想到一种$O(n)
阅读全文
摘要:是个好东西啊!无旋转果然是好写,而且还是比较好理解的。 这种数据结构是由神犇fhq发明的。 fhq神犇说,函数式编程的一大特点就是,不修改,只定义。普通的平衡树,无论是treap还是splay,都需要进行旋转来维护树的平衡性
阅读全文
摘要:"传送门" 一道非常好的LCT/树剖题。但是像我这样的菜鸡想不到什么有效做法…… 首先我们可以很容易发现,一次如果要在链上连续修改那么肯定是从底向上的一端连续区间。如果我们把每个节点的输入值作为其权值,那么会被连续更改的一定是一端连续的为1或者为2的区间。 那么我们就可以通过维护这个区间来解决这道题
阅读全文
摘要:"传送门" 首先吐槽一下……这题还吓唬你。都说了图中没有同色环,还说什么“所有可能从u到v的简单路径”,就一条…… 很显然就是每一种颜色维护一个LCT。因为颜色很少所以多开几棵就行。 有一些要注意的: 1.在修改的时候,首先我们得先找到连接这两个点的边原来是什么颜色的。这个必须是直接相连,因为有可能
阅读全文
摘要:"传送门" 这题数据范围贼小……听说可以用各种乱七八糟的暴力随便过去。 其实这题就是找最长公共子串。但是我一直不知道怎么处理加数的情况……今天豁然开朗,直接对每个串做一次差分就好了。 之后就是我们正常的匹配,每次用子树内的值更新节点的值,最后的时候答案取所有节点最小匹配值的最大值+1.
阅读全文
摘要:"传送门" 朴素的想法是直接用SAM模拟,但是这样的话每次归并排序会T掉…… 考虑到每次的影响,对于初始的SAM来说,我们每次新加入一个点,那么就会使这个点到状态的路径上所有的点全部权值+1,于是我们需要维护路径,同时还需要支持动态插入,那就是LCT了。 于是乎我们需要用LCT来维护SAM
阅读全文
摘要:"传送门" 首先很容易想到对于所有的模式串建出广义后缀自动机,之后对于我们每一个要检查的文本串,先在SAM上跑,计算出来每一个位置能匹配到的最远的位置是多少。(就是当前点减去匹配长度) 之后……考虑DP……一开始我的状态设错了,设成了当前位置的最大的L的值,这样我就不知道怎么转移了…… 于是换一个思
阅读全文
摘要:"传送门" 这题的字符串匹配搬到了树上……?那不在一条链咋做啊……不会了,凉凉…… 然后丽洁姐姐给我们留了一条生路……就是保证了叶子节点的个数不超过20. 树上任意一条路径,我们总能找到一个叶子节点,使得以它为根的时候这条路径在一条链上。那我们可以把每个叶子节点作为根节点来建立广义后缀自动机,最后直
阅读全文
摘要:"传送门" 两个串嘛……可以建广义后缀自动机。 我们每次要记录一下对于每个节点,其对应的在第一个串上的size和第二个串上的size,那么每个节点对于答案的贡献就是 解释一下,size其实表示的就是endpos集合之内的元素个数 ,也
阅读全文
摘要:"传送门" 广义后缀自动机…… 其实也不是很难理解,就是每次SAM插入一个串之后,插入新的串的时候,要把last重新调到1的位置,共用一些节点。 这个题我们首先要预处理出来每个状态被多少个串共用。~~挺暴力的~~就是每次把节点染色,如果节点没被染色就给他染一下,然后记录当前节点又被共用了一次。 最后
阅读全文
摘要:"传送门" 前一题的加强版……求10个串的最长公共子串的长度。 OI Wiki上的解法我没看懂…… 朴素的想法还是对第一个串建立SAM,之后把后面的串不断地在上面匹配,对于每一个状态记录匹配最小值,所有状态取最大值。不过这样是会WA的…… 为啥呢?因为我们是对于每个状态取最小,然后最后在算答案的时候
阅读全文
摘要:"传送门" 求两个字符串最长公共子串的长度。 对于第一个串S,建立SAM,之后对于第二个串T,我们在上面和S进行匹配。首先从开始,如果能成功匹配的话,那么我们让长度+1,同时更新答案。如果失配,那我们就跳parent树转移到其父节点的位置,并且把当前匹配长度变为其最长后缀长度即可。 最后统
阅读全文
摘要:"传送门" 我一开始的想法是直接去求后面的,但是我不会…… 有一条性质:两个后缀的就是他们在树上的,而且出题人给这个式子其实是有目的的……我们把式子拆开,对于每一条边,我们赋一个权值为,这样的话我们只要求出
阅读全文
摘要:"传送门" 对于SAM上的一个状态,我们可以求出这个状态对应着多少子串,这个很好做,我们只要每次统计一下他所有的转移把对应情况加上就好。 我们首先对SAM上的状态进行拓扑排序(虽然说是拓扑排序但是实际上可以用基数排序完成,以每个状态对应的最大后缀长度为关键字)。之后对于情况1,我们在跳parent树
阅读全文
摘要:"传送门" 用SAM可以非常轻松的解决问题。 只要把原串向SAM中插入两次,之后直接从状态开始每次贪心跑最小就可以了。 因为这个题要用map,所以之前取begin即可。
阅读全文
摘要:"传送门" (vjudge和hdu也有但是我觉得LOJ好看!而且限制少!) 不过本题描述有误,应该是k小。 首先我们需要对线性基进行改造。需要把每一位改造成为,包含最高位的能异或出来的最小的数。 为啥呢?因为如果不满足这个条件的话,那么在之后的异或过程中,大的数反而会被小的数异或的更小。 满足了上述
阅读全文
摘要:"传送门" 这个题题目描述真怪异……就不能说人话吗…… 人话:给定长为n的序列A,定义f(s)为集合s内所有元素异或值,求A的所有子集的f值从小到大排列后,q在其中第一次出现的下标对10086取模的值。 首先不难想到构建线性基。线性基有一个良好的性质!假设这n个数的线性基中有k的数,那么显然有$2^
阅读全文
摘要:"传送门" 题目要求的就是求一个线性无关的方程组…… 于是学到了一个新的东西,叫实数下的线性基……这个其实和普通的线性基很像。具体做法就是,我们首先把所有物品按价格从小到大排序,之后贪心的先选取价格小的。每次我们遍历其一位属性,如果这一维基底当前为空,就把它压入,否则的话计算它和当前这一维基底的比值
阅读全文
摘要:"传送门" 如果只是一条路径的话,那就是非常简单的线性基。 不过要考虑多组询问…… 考虑到n比较小,我们可以模仿倍增LCA的方法,预处理倍增的线性基。在每次路径上跳的时候把线性基合并最后求解即可。具体的做法是,我们用表示在编号为x的点处,向上跳步以内,线性基第j位的
阅读全文
摘要:"传送门" 首先,我们可以发现,只要在第一次我们自己拿的时候,使得对方无论怎么拿都不能使异或和为0即可获胜。 考虑到线性基任意一个非空子集的异或和不为0,那么我们只要给对方留下一个线性基即可。所以先手必胜。 之后考虑怎么让代价最小。这个也很简单,我们仿照上一道题目的做法,优先插入权值大的堆。每次判断
阅读全文
摘要:"传送门" 线性基有一个重要的性质:线性基中任意一个非空子集的异或和不为0。 这好像就是给这道题准备的! 立即得到做法:按权值从大到小排序,直接插入线性基计算答案即可。
阅读全文
摘要:"传送门" 做了前几天的模拟看这个现在很有感觉…… 首先我们能想出,走任何一条路径,都是可以把所有环的贡献全部异或到的(走过去的路和回来的路是一条路,贡献为0)。 因为要求最大异或和容易想到线性基。于是我们先搜索出所有环,并且把它们的异或值加入线性基中。 之后我们就只要找一条路,用它到终点的异或和和
阅读全文