摘要:
有$n$个字符串互不包含,$\sum len\le 10^5$。求一个最短的字母序列的长度,使得这个字母序列中出现了$m$次那$n$个字符串。举个例子: 那么符合要求的字符串有 所以输出为5,即abcab为最短的符合要求的。$n\le 200,m\le 10^9$。 思路 读懂题就能知道,让一个字符 阅读全文
摘要:
有$n$天,$m$类志愿者,一个第$i$类志愿者可以从第$s_i$天工作到第$t_i$天,第$i$天工作的志愿者不少于$b_i$个。每一类志愿者都有单价$c_i$,问满足要求的最小花费。 分析 它其实是这样一个问题: $$ \text{Minimize }CX \\ AX\ge B \\ X\ge 阅读全文
摘要:
开始给出平面上$n$个点,$m$个操作,每次加一个点或者查询一个点的曼哈顿距离最近点的曼哈顿距离。(坐标为整数)。 $n,m\le 5\times 10^5$。 分析 首先KD Tree的做法是错误的,一个经典的例子是给出$n$个点的圆,询问圆心。 如果这个问题是只统计一个角方向(一个点左下方,右下 阅读全文
摘要:
一颗$n$个点的树,初始颜色都不同,初始根为1。定义一个点到根的代价为这个点到根路径上不同颜色个数。有$m$个操作,分三种: 将一个点到根路径上的所有点颜色改为一种新的颜色 询问一个点的子树的所有点到根的代价和 对点$x$进行操作1后把根换成$x$ $n,m\le 10^5$。 分析 那个修改看着是 阅读全文
摘要:
题意 给一个长度为$n$的字符串$s$,再给定一个$w$,问对于所有的$i\in [1,n w+1]$,$s[i..i+w 1]$有多少个不同字串。$n,w\le 10^5$。 分析 统计不同子串个数的问题可以使用后缀树。一个字符串的后缀树的总边长就是这个字符串的不同子串个数。解决这个问题,一个显然 阅读全文
摘要:
Ukkonen算法是一个非常直观的算法,其思想精妙之处在于不断加字符的过程中,用字符串上的一段区间来表示一条边,并且 自动扩展 ,在需要的时候把边分裂。使用这个算法的好处在于它非常好写,代码很短,并且它是 在线的 ,时间复杂度为$O(n)$ ,是后缀树构建算法的佳选。 算法 我们保存当前节点 的位置 阅读全文
摘要:
一般求最小生成树的时候,最流行的是Kruskal算法,一种基于拟阵证明的贪心,通过给边排序再扫描一次边集,利用并查集优化得到,复杂度为$O(ElogE)$。另一种用得比较少的是Prim算法,利用优先队列实现做到$O(ElogV)$。 在翻 "ZYQN" 博客的时候,看见他写的位运算最小生成树中提到了 阅读全文
摘要:
题意其实就是说有很多个点,求一组边把它们都连接起来,并且最大的那条边最小。很明显这就是一个最小生成树,是一颗保证最长边最短的树。 代码 刚刚学了个Borůvka算法,于是写了两个。 Borůvka Kruskal 阅读全文
摘要:
问题 对于一个图$G(V,E)$,它的匹配$M$是二元组$(u,v)$组成的集合,其中$u,v\in V,(u,v)\in E$,并且$M$中不存在重复的点。 当$|M|$最大的时候,我们称$M$为$G$的最大匹配。 当$G$是一个二分图的时候,它的最大匹配可以用经典的匈牙利算法或网络流算法求解。然 阅读全文
摘要:
昨天我们学习了ISAP算法,它属于增广路算法的大类。今天学习的算法是预流推进算法中很高效的一类——最高标号预流推进(HLPP)。 预流推进 预流推进是一种很直观的网络流算法。如果给到一个网络流让你手算,一般的想法是从源点开始流,遇到不够的就减掉,一直往前推到汇点。这就是预流推进算法的基本思想。 每个 阅读全文