随笔分类 - 算法碎片
摘要:记忆 两个for用来寻找LCS,DP是二维的,每一维代表了字符串的长度。 寻找的代码部分 如果相等左上+1否则左边上面取最大值 输出路径的时候从最右下开始如果左边相等左移右边相等右移,否则大于左上左上移动记录此时的字符,并且要倒叙输出 完整板子(输出两个字符串的LCS个数以及LCS) include
阅读全文
摘要:简介 自己从大数加法改过来的模板,低速计算n的t次幂,n,t小于等于100速度能够保证 模板 include using namespace std; string cal(string a,int cs) { string jk=a; string jc=a; reverse(a.begin(),
阅读全文
摘要:最近才知道还有二分查找的算法 二分搜索 这个没什么好说的,就是有序数列找一个值就可以了,代码也十分的简单 代码(数组中找一个数找到输出1,找不到输出 1) include using namespace std; int num[50005]; int main() { ios::sync_with
阅读全文
摘要:什么是强连通分量? 百度百科 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子
阅读全文
摘要:什么是差分约束系统? 百度百科 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。 具体怎么
阅读全文
摘要:什么是单调队列? 百度百科 单调队列,即单调递减或单调递增的队列。 单调队列能干什么? 实现快速寻找区间的最大值与最小值 如何实现单调队列?(这里使用了STL的deque) ①建立结构体 因为我们之后要判断队首的元素是不是已经超出了滚动窗口,所以得把每个值记录他原来的位置 ②判断原来的队首是不是还在
阅读全文
摘要:什么是AC自动机? 百度百科 Aho Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法。 要学会AC自动机,我们必须知道什么是Trie,也就是字典树。Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符
阅读全文
摘要:什么是trie? 百度百科 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 t
阅读全文
摘要:什么是pb_ds? 除了众所周知的STL库,c++还自带了ext库(应该可以这么叫吧),其中有用pb_ds命名的名称空间(俗称平板电视)。这个名称空间下有四个数据类型结构。这些都是鲜为人知的。经过测试目前所有的OJ都支持pb_ds库,OI据说也支持。网上资料显示只要是稍微高级一点的linux判卷机都
阅读全文
摘要:应用二分查找的条件必须是数组有序! 其中二分查找函数有三个binary_serch,upper_bound,lower_bound 测试数组 binary_serch 没有什么好说的,这个很简单,接受三个参数first,last,key三个值。如果在数组中查询到的话,那么就返回1否则返回0 代码 b
阅读全文
摘要:LIS问题 什么是LIS? 百度百科 最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。 怎么求LIS? O(n^2)做法 具体做法是用两个for,状态转移方程为f[i]=max(f[i],f[j]+1)其中f
阅读全文
摘要:什么是Manacher算法? 转载自百度百科 Manachar算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊字符,因此原本长度为偶数的回文串就成了以中间特殊字符为
阅读全文
摘要:什么是KMP KMP俗称看毛片算法,是高效寻找匹配字串的一个算法 百度百科 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模
阅读全文
摘要:什么是差分数组? 定义 对于已知有n个元素的离线数列d,我们可以建立记录它每项与前一项差值的差分数组f:显然,f[1]=d[1] 0=d[1];对于整数i∈[2,n],我们让f[i]=d[i] d[i 1] 简单性质 原数组的第i项为差分数组的前i项和 基本应用 快速更改区间各各数的值,如果对原数组
阅读全文
摘要:什么是树状数组? 百度原文 ·树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是
阅读全文
摘要:Kruskal算法 伪代码 sort间接排序r[i]数组,找出权值最小的边 进行判断如果不是在一块的,那么答案加上权值两条边合并 模板 include using namespace std; int f[200010],r[200010]; int num[200010],to[200010],c
阅读全文
摘要:编写find函数 find函数赋值初值 合并操作为f[find(t2)]=find(t3),查找操作为if(find(p2)==find(p3)) 代码 include using namespace std; int f[10010]; int find(int k) { if(f[k]==k)
阅读全文
摘要:``` include using namespace std; int main() { int n,a,ans=1 n; while(n ) { cin a; now+=a; if(now ans) ans=now; if(now
阅读全文
摘要:注意!!!下面的模板有的并没有去设定具体的无法到达的极限值,也没有考虑极限相加爆表的情况,如果可以的话,最好还是把dis数组定义成long long Floyd算法(仅仅四行的算法) Floyd算法仅仅四行就能解决问题但是时间复杂度达到了感人的O(n^3),唯一的有点是能够输出任意两点之间的最小路径
阅读全文

浙公网安备 33010602011771号