加载中...
AC 自动机
AC 自动机 很多人在第一次看到这个东西的时侯是非常兴奋的。不过这个自动机叫作 Automaton,不是 Automation,这里的 AC 也不是 Accepted,而是 Aho–Corasick(Alfred V. Aho, Margaret J. Corasick. 1975)。 前置 Trie (字典树) KMP (只要失配指针的思想即可) 定义 AC 自动机是 以 Trie (字典树) 的结构为基础,结合 KMP (字符串匹配) 的思想 建立的自动机,用于解决多模式匹配等任务。 构建 先简单解释一下: AC 自动机由两部分组成: 将模式串构造成一棵普通的 Trie。 利用 KMP 思想构造失配指针。 失配指针 同 KMP 一样,AC 自动机同样构造一个 fail 用于失配时的跳转指针。 但 AC 自动机的 fail 指向当前状态的最长后缀。 定义如下变量: 当前节点 u,u 的父亲节点 p,p 和 u 间用一条字符 c 连接。 字典树的边集 tr。(tr[u][c] 表示节点 u 的 c 出边的点) 假设所有深度小于 u 的 fail 指针均已求得。 若 tr[fa ...
字典树
字典树 定义 字典树 ( trie ),将多个字符串进行 树 一样的处理,从而快速查找的一种算法。 实现 如图,我们依次加入 1234567abababacaaacabcbacc 我们以边代表字母,结点之间的路径就为字符串 就得到了这棵树 1
How to prove Girl=Evil
∵To chase a girl needs time and money. ∴ Girl = Time × Money ∵time is money ∴ Girl = Money2 ∵money is the root of evil. $\therefore Girl\ =\ (\sqrt{Evil})^2$ ∴ Girl = Evil 重点词解释: chase n. 追求 root n. 根;根源 evil adj. 邪恶的
oi梗
关于一些oi的梗 模拟只会猜题意,贪心只能过样例。数学上来先打表,DP一般看规律。 组合数学靠运气,计算几何瞎暴力。图论一顿套模板,数论只会GCD。 骗分过样例,暴力出奇迹。暴搜挂着机,打表出省一。N方过百万,暴力踩标算。肥修赛大象,只是代码短。 想要骗到分,一定有方法。图论背模板,数论背公式。动规背方程,高精背代码,要是都不会,干脆输样例。 10年OI一场空,没开long long见祖宗 高级算法:可持久化非确定状态AC自动分块维护线段平衡仙人掌优化最小费用最大流预处理混合图上莫比乌斯反演莫队带花舞蹈链并查集树状数组套主席树预处理动态DP分治FFT求多项式逆元对数函数的指数函数用可持久化并查集合并最小费用循环流上插头DP 模拟只会猜题意,贪心只能过样例。 数学上来先打表,动规一般看规律。 组合数学靠运气,计算几何瞎暴力。 图论一顿套模板, 数论只会GCD。 递归递推伤不起,搜索茫然TLE。 分治做得像枚举,暴力枚举数第一 数据结构干瞪眼,怒刷水题找信心。 涨姿势也不容易,考试一来全懵逼。 怎么进队拿国一?看懂洛谷A+B。 刷题是一种出路, 枚举是一种思想。 打表是一种勇气, ...
计算几何合集
计算几何 三角函数 $\sin{\alpha}=\frac{b}{c}$ 正弦函数:对边比斜边 $\cos{\alpha}=\frac{a}{c}$ 余弦函数:邻边比斜边 $\tan{\alpha}=\frac{b}{a}$ 正切函数:对边比斜边 向量 …持续更新
前缀函数
前缀函数 前置 子串 字符串中连续的一段。 前缀 指从字符串开头到某个位置结束的特殊子串 真前缀 指从字符串开头到某个位置结束的特殊子串(不包含字符串本身) 后缀 指从某个位置开始到字符串结尾的特殊子串 真后缀 指从某个位置开始到字符串结尾的特殊子串(不包含字符串本身) 定义 对于一个长 n 的字符串 s,我们设 i 位的前缀函数为 πi 若 s 的子串 0 ∼ i 有一对相等的真前缀与真后缀,则 πi 为真前缀(真后缀)的长度。 若不止一对相等的,令 πi 为最长的长度。 若没有,则 πi = 0 π0 = 0 计算方法 朴素(暴力) 枚举:O(n3) 优化一 简单思考一下,πi + 1 的值至多为 πi + 1 O(n2) 优化二 在寻找真前缀与真后缀时,我们会枚举一个长度 j 当匹配失败时,我们希望找到仅次于 j 的长度 j(2),其中 j(2) 我们希望他满足前缀性质。 所以,j(n) = πjn − 1 − 1 O(n)
数论合集
数论 Date:2023.1.14 素数(质数) 定义 只有两个因数的数叫做质因数(1和它本身) 1 既不是素数也不是合数 判断素数 朴素算法 枚举 2 − (n − 1)的所有数字,判断其是否能被整除,时间复杂度:$\color{orange}O(n)$ 或者可以优化一下,枚举区间改成 $2-\sqrt{n}$,时间复杂度:$\color{orange}O(\sqrt{n})$ 埃式筛法 对于多个大数,朴素算法显然慢了 对于求多个质数,我们可以运用标记思想 我们知道,对于一个 x ∈ Z,它的倍数一定是约数 所以我们可以从小到大的枚举 n 内的质数,标记它的倍数,没被标的即是质数 时间复杂度:$\color{orange}O(n\, In\, In\,n)$(In n表示logen) 123456789101112131415161718192021#include<stdio.h>#include<cmath>#define N 10005using namespace std;int n;int f[N],ss[N],cnt;void ssai(i ...
二叉搜索树
树——二叉搜索树 Date:2023.1.14 定义 二叉搜索树是一棵二叉树,具有以下定义: 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。 二叉搜索树的左右子树均为二叉搜索树。 一些操作 先看变量: lcx:x点的左儿子 rcx:x点的右二子 valx:x点的值 cntx:x点值的数量 sizx:x点子树的数量 插入 向树中插入一个值 递归插入 与当前节点比较,若权值小于它,加入左子树,反之加入右子树 若当前点权值与插入值一样,当前点 cnt + + 若当前节点为空,将节点设为当前节点 插入时注意更新变量 不要忘记更新父节点的儿子 删除 在树中删除一个值 先在树中查找该值节点 设改点为 x,分类讨论 若 cntx > 1,将 cntx − − 若 cntx = 1 若该点是叶子节点(没有儿子),删除该节点 若该点只有一个儿子,返回它的儿子 若该点有两个儿子,返回左子树的最大值或右子树的最小值 查找最大/最小值 查最小值一直往左儿子跳 查最大值一直往右儿 ...
operator浅谈
operator浅谈 前言 operator,即c++的重载运算符。 可以理解为定义了一个符号的运算规则,用来更方便处理高精度等特定运算。 使用须知 =赋值运算符、[]下标运算符、()函数调用运算符、 − >成员访问运算符。 只能作为类成员重载,不能作为友元函数。 还有,重载后无优先级,可以打括号。 Finally,你不应该重载 && ∥∥ & 运算符,他们在程序中有重要的作用。 使用 你应该把他定义在结构体里,他不会对结构体外的运算符产生影响。 123{结构体名} operator {运算符}({运算符}){ {重载规则}}    例题 单讲不好讲,上一道例题:高精度a+b 1234567891011121314151617181920212223242526272829303132333435363738#include <bits/stdc++.h>using namespace std;struct high { int le ...
网络流--Dinic
网络流——最大流算法dinic 过程 整体来说,dinic 是不断 bfs分层+dfs增广 的过程 bfs分层 每个点的 层数 即为它到源点的最短距离,源点的 层数 为 0 通过它,我们可以发现: 1.当汇点没有 层数 时,算法结束 2.当每次搜索只搜比当前点 层数 多一的点,我们找到的肯定是最短增广路 至于怎么分…… 不会有人不会吧 dfs增广 先看一些变量: s:源点, t:汇点,ans:最大流 c:边的容量 f:边的流量 sum:一次dfs的流 运用分层,我们可以轻易的找到最短增广路 从起点开始,每次往下进行搜索,只搜比当前 层数 多一的点,且管道的 c > f 当搜到 t 点,结束 dfs ,继续分层 两个优化 1.多路增广 该优化可让你一次搜到多条增广路 思路 当你从某个点回退到上一个点时,若该点 流量 > 0且还有其他可走路径 那我们就考虑对其再进行 dfs 2.当前弧优化 该优化可帮你避免不必要的搜索 思路 我们知道,当一条边 c = f 时,他就没有用了 这时,我们可以考虑避免对这些边的搜索,把头指针指向下一条边就可以了 同时,对于一次 dfs,它搜过的边不 ...
网络流--ISAP
网络流——最大流算法ISAP Date:2023.1.12 简介 ISAP 和 dinic 十分相似,应该比较好懂 GAP 则是 ISAP 的优化 ISAP ISAP 算法,也是运用 bfs分层+dfs搜索 与 dinic 区别有两点: 1.只用了一次 bfs 分层,后续层数更新随着 dfs 一起 2.因为某些原因(dfs 更新层数),dfs 需要反跑(汇点->源点) 过程 因为 ISAP 的 dfs 需要反跑,知道大家肯定打不习惯 于是,我们可以反跑 bfs分层,就可以正跑 dfs(反跑时汇点层数为 0) dfs 时,过程与 dinic 基本相同,这里不详细展开 主要说如何更新层数: 更新层数 设 i 点的层数为 di 当我们结束了一次 dfs(没有路可走),我们就要更新层数 遍历 i 的所有连点 (c>f),找到连点中最小的层数,设为 dj 令 di = dj + 1 若点 i 没有连点,令 di = n 另外,我们不难发现,当 ds ≥ n,增广路已被搜完,结束循环 优化 当前弧优化 时间复杂度:$\color{orange}O\left(n^2m\right)$ G ...
网络流--EK
网络流——最大流算法EK Date:2023.1.9 简介 EK 算法,即 Edmonds-Karp 动能算法,是求解最大流的基本算法。 反向边 反向边 是帮助程序能发现更优解 例: —->A—->B—-> 发现了一条 增广路 但后面发现: —->C—->B—-> —->A—->D—-> 这样比原方案更优 所以要建立一条 反向边,B—->A,让流过去的水能够流回来 下面讲一下建 反向边 方式: 链式前向星(链表) 在添加 正向边 时,也把 反向边 给添加(容量为0)。 这样对于第 i 条边的 反向边 是 i ⊕ 1(编号请从偶数开始存,虽然奇数也不会错(玄学)) 邻接矩阵 这难道还要我说? 过程 整体来说,就是一个不断 bfs+增广 的过程 为了方便讲解,我们在此定义一些变量: s:源点,t:汇点,ans:最大流 c:边的容量 f:边的流量 l:点的流量 bfs 每次从源点出发,进行搜索,若寻找到t,结束 bfs 进行增广。 假设现在我们要从 x->u 1.先判断能不能,即 u 是第一次搜到 且 该边的 c > f ...
avatar
星光light
星光照耀,灿烂前行
Follow Me
最新文章
网站资讯
文章数目 :
38
已运行时间 :
本站总字数 :
33.7k
本站访客数 :
本站总访问量 :
最后更新时间 :