算法【模版】
文章平均质量分 94
常用算法模版
学徒小昊
ACM新人
展开
-
【模版】AC自动机
【模版】AC自动机可以在文本串中查找多个模式串。前置知识点:KMP 算法Trie 树开了一个 fail[i]fail[i]fail[i] 数组(存的是 trietrietrie 树上的结点号)表示 trietrietrie 树的第 iii 号点在 文本串上 第 trie[i][j]trie[i][j]trie[i][j] 号节点匹配上时,跳至 与当前所在 模式串的后缀有公共 前缀的 下一个模式串。跳至的目标就是 fail[i]fail[i]fail[i] ()...原创 2020-07-27 10:34:21 · 195 阅读 · 1 评论 -
【模版】trie树
trie树字符串树,多叉树。每个结点保存的是单个字符,结点按从小到大的顺序编号。对有公共前缀的若干组字符串,公共部分不用建立多余结点。有插入和查询两种操作。代码很好记也很好理解。算法流程:整型二维数组 trie[最大字符数量][字符种类数量]trie[最大字符数量][字符种类数量]trie[最大字符数量][字符种类数量] 。赋值 为 结点数。插入:对于要插入的字符串 SSS。从前往后处理:判断当前字符有没有被记录过,如果没有被记录,则增加结点并记录(如果被记录过,即与之前插入的字符串有.原创 2020-07-09 16:18:36 · 201 阅读 · 0 评论 -
【模版】缩点
缩点缩点可以简化图,去除图里的环,化环为点,简化题意。算法流程:①:各类数组的意义如下:dfn[]dfn[]dfn[] 数组记录 该点是该点的访问时间。low[]low[]low[]数组记录 该点所在的环上最早被访问到的点的时间。sta[]sta[]sta[] 统计该环上所有的点。vis[]vis[]vis[] 记录该点 是否在栈中。②:tarjantarjantarjan 是 dfsdfsdfs 遍历的名称。每访问一个点,记录该点的 dfn 和 low 的信息,入栈 并 标记 v.原创 2020-07-09 13:48:46 · 932 阅读 · 0 评论 -
【模版】莫队(带修改莫队、树上莫队)算法
莫队算法莫队算法是 离线 解决 区间查询 问题的一种高效暴力算法。前置知识点:①①①分块 ②②② sortsortsort关键字排序 ③③③ lcalcalca查询(树上莫队)时间复杂度:O(n∗n)O(n*\sqrt{n})O(n∗n)空间复杂度:O(n∗n)O(n*\sqrt{n})O(n∗n)算法流程:一、确定分块大小:每块大小为 n\sqrt{n}n 。确定每个元素属于哪一块。二、用结构体存储询问并用 sortsortsort 排序:对于每次询问的 左端点 lll,按照 .原创 2020-07-07 15:02:47 · 1710 阅读 · 3 评论 -
【模版】线性基 + 变形
线性基线性基的性质:1.1.1.线性基能相互异或得到原集合的所有相互异或得到的值。2.2.2.线性基是满足性质 111 的最小的集合3.3.3.线性基没有异或和为 000 的子集。先引入 p[i]p[i]p[i] 的概念和用法:①①① p[i]p[i]p[i] 记录 原集合的数字,该数字的二进制下从小到大第 iii 位为1。②②② 每个数字最多被记录一次。③③③ 数字优先从高...原创 2020-02-21 23:24:28 · 473 阅读 · 4 评论 -
【模版】字符串匹配 KMP 算法
字符串匹配KMP算法给出两个字符串 S1S_1S1 和 S2S_2S2 ,其中 S2S_2S2 为 S1S_1S1 的子串.1.1.1. 求出 S2S_2S2 在 S1S_1S1中所有出现的位置.2.2.2. 输出子串的前缀数组 nxt[i]nxt[i]nxt[i].先引入两个概念(通俗解释):模式串:要查找的字符串。(即 S2S_2S2 )文本串:被用来查找模式...原创 2020-02-21 14:14:02 · 528 阅读 · 0 评论 -
【模版】树(重)链剖分
重链剖分已知一棵包含 NNN 个结点的树,每个节点上包含一个数值,需要支持以下操作:操作111: 格式: 111 xxx yyy zzz 表示将树从 xxx 到 yyy 结点最短路径上所有节点的值都加上 zzz操作222: 格式: 222 xxx yyy 表示求树从 xxx 到 yyy 结点最短路径上所有节点的值之和操作333: 格式: 333 xxx zzz 表示将以 xxx 为根节...原创 2020-02-19 00:50:37 · 190 阅读 · 0 评论 -
【模版】最近公共祖先LCA(链剖)
最近公共祖先LCA(链剖)给定一棵 以 sss 为根节点,共有 nnn 个点的树。有 mmm 次查询 任意两点 u,vu ,vu,v 的最近公共祖先。一、前置知识点1.邻接链表 存图2. dfsdfsdfs 序二、算法流程...原创 2020-02-14 17:22:21 · 787 阅读 · 0 评论 -
【模版】线段树
线段树线段树是一种普通的高等树状数据结构。基础的线段树可以解决区间加减修改区间加减修改区间加减修改,查询区间和区间和区间和和极值极值极值。线段树是一棵二叉树,每个节点一定有两个或无孩子。每个节点可以保存区间信息,那么左孩子可以保存前半个区间的信息,右孩子保存后半个区间的信息。两个孩子所记录的信息无交集 且 并集 等于 父亲所保存的信息。(信息即 元素)。当该节点只储存单个元素信息时,就...原创 2020-02-10 16:14:31 · 345 阅读 · 0 评论 -
【模版】输入\输出优化
输入\输出优化对数字的读入,编程中有常用的 cincincin 和 scanfscanfscanf 。但读入的数据较大的时候,cincincin 读入的速度 远低于 scanfscanfscanf (差距不小)一个优美的算法题讲究效率,但有不少题目的输入量或输出量太大,导致读入或输出的时间占比较大,这是一个优质题目的缺憾。众所周知计算机读入字符的速度是较快的,那么我们可以考虑把数字依次...原创 2020-02-07 22:23:23 · 153 阅读 · 0 评论 -
【模版】并查集(及其加权)
并查集并查集是经典的图论算法,用来维护点与集合的关系,代码也简洁明了。给定 NNN 个点,有 MMM 次操作,每次操作输入 ppp aaa bbb 。若 p=1p = 1p=1 ,则 合并 aaa bbb;若 p=2p = 2p=2 ,则 查询 aaa bbb 是否同属一个集合;并查集初始化:每个父亲点 都 存储 儿子的信息:for(int i = 1; i <= n; i+...原创 2020-02-05 23:39:36 · 280 阅读 · 0 评论 -
【模版】最近公共祖先LCA(倍增)
最近公共祖先LCA(倍增)给定一棵 以 sss 为根节点,共有 nnn 个点的树。有 mmm 次查询 任意两点 u,vu ,vu,v 的最近公共祖先一、前置知识点1.邻接链表 存图2.倍增原理 ( 2n2^n2n 的预处理应用 )二、算法流程1.预处理一:以 sss 为根节点进行一遍dfs。处理出:孩子节点iii 的深度(deep[i]deep[i]deep[i]) : d...原创 2019-12-30 16:53:36 · 174 阅读 · 0 评论 -
【模版】乘法逆元
乘法逆元当求解答案过程中对p取余同时又涉及除法运算时,需要把除法转成乘法才能保证经过模法运算后答案是正确的。一、线性递推求逆元输入 nnn , ppp 。求 1,2,3,...,n1,2,3,...,n1,2,3,...,n 在模 ppp 意义下的逆元。inv[1]=1;for(int i=2; i<=n; i++) inv[i]=(p-p/i)*inv[p%i]%p;...原创 2019-12-13 17:17:25 · 289 阅读 · 0 评论 -
【模版】最小生成树Kruskal
#最小生成树nnn 个点,mmm 条边的无向图。求最小生成树的边权值和。贪心思想:将每一条边的u,v,wu,v,wu,v,w信息保存下来,然后按照权值从小到大的顺序依次加边。每次加边的时候,判断 u,vu,vu,v 是否属于同一集合(用并查集维护).如果是,则不加边;如果否,则加边并记录答案例题:luogu P3366 最小生成树[模版]luogu P1550 打井#inclu...原创 2019-12-13 16:56:53 · 157 阅读 · 0 评论 -
【模版】最短路Dijkstra + Floyed
#最短路Dijkstra(堆优化)一、前置知识点:1.pairpairpair的使用2.优先队列的使用3.原 dijkstradijkstradijkstra的 n2n^2n2 写法二、其他优化所在:当原来需要 O(n)O(n)O(n)的复杂度,从已经更新好最短路的点 更新 新的最短路时,可以用优先队列用 O(n2)O(\sqrt[2]{n})O(2n)的方式直接取出 最短路的更新...原创 2019-12-13 16:40:12 · 223 阅读 · 0 评论 -
【模版】快速幂 / 矩阵快速幂
#【快速幂】int pow(int x,int y){ int ans=1; while(y) { if(y&1) ans=ans*x%p; x=x*x%p; y>>=1; } return ans;}原理:xyx^yxy中的y转化成二进制数,然后每一个1对应 xxx 的 iii 次方这样把xyx^yxy转化成了xyx^yxy = x...原创 2019-12-13 16:13:51 · 203 阅读 · 0 评论 -
【模版】ST表
##【模版】ST表给定一个长度为n的序列,查询q次al…ar的极值。(RMQ问题)(比线段树的常数小,代码简短。但是不支持修改且只能用于查询极值)#include <iostream>#include <cstdio>#include <cmath>using namespace std;int n,m,l,r;int f[101010][20]...原创 2019-08-27 23:47:14 · 215 阅读 · 0 评论