![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法学习随笔
大学比赛中解题学习中的算法笔记,如有错误请指出,非常感谢!
sykai1
这个作者很懒,什么都没留下…
展开
-
manacher(马拉车)算法
断断续续地看了两天的马拉车算法,可算是给搞明白了(贼开心),这算是自己搞懂的第一个算法了(23333333333333)这个算法照目前自己的理解来看,貌似就只能求个字符串中的回文串(接触这个算法是要求最长的回文串),虽然应用的范围有点少,但还是要学习滴,不然遇到类似的题目就gg了。可以在线性时间内求得答案,时间复杂度为O(n)。1、回文串的个数是可奇可偶的,碰上奇数的回文串还可以,如果是偶...原创 2018-04-16 21:51:38 · 264 阅读 · 0 评论 -
逆元Inv(模板+应用)
逆元:如果满足公式,则有a 是 b的逆元同时b也是a的逆元。逆元的应用:设c为b在对m取余的意义下的逆元;在求解公式 (a / b) % m的时候,如果b可能会非常的大,所以会出现爆精度的问题,这个时候就需要将除法转换成乘法来做,即:(a / b ) % m = (a * c)%m。逆元的求法:一、扩展欧几里得求逆元复杂度:O(logn)(实际就是斐波那契数列)...原创 2018-08-31 23:39:15 · 668 阅读 · 0 评论 -
组合数,阶乘求法
复杂度:O(n^2)C[i][j]即为C(i,j);#include <bits/stdc++.h>using namespace std;const int MOD = 1e9+7;const int maxn = 1e3;typedef long long ll;int n,k;ll C[maxn][maxn];int main(){ n = 1...原创 2018-08-31 21:14:14 · 4041 阅读 · 0 评论 -
Cat VS Dog HDU_3829(最大独立集最大匹配)
Cat VS Dog题意:一群小朋友去动物园,如果每个小朋友喜欢的动物是猫,那么不喜欢的动物一定是狗,反之也是。现在动物园的管理者要拿走一些动物,如果拿走的是某个小朋友不喜欢的动物,那这个小朋友就非常开心,反之,如果是某个小朋友喜欢的动物,这个小朋友就非常的不开心,问那完后最多有几个小朋友会非常开心。暑假最后一场个人赛,可还行,有点凉凉~~讲真看出是二分图最大匹配的题目,但是没学最大独...原创 2018-08-17 18:57:37 · 155 阅读 · 0 评论 -
弗洛伊德算法--代码模板
翻自己的文章的时候突然发现自己写的有错误,特来改正一下。可以求得任意两点之间的最短路问题int d[maxn][maxn];//d[st][en]表示边e = {u,v}的权值(不存在时设为INF,d[i][j] = 0)int V;//顶点的个数void Floyd(){ for(int k = 0; k < V; k++) for(int i =...原创 2018-08-13 18:33:28 · 253 阅读 · 0 评论 -
Dijkstra算法--代码模板
自己对Dijstra算法的理解是:首先输入保存点,边的权值(注意无向图和有向图在保存时的区别)。 将表示从起点st到顶点 i 的距离的d[ i ]数组的每一个值初始化为INF,令d[st] = 0。 遍历d[ ]数组的下标 i (即顶点 i)这个操作是通过优先队列来实现的,然后遍历以顶点 i 为起点的边,更新d[ i ]的最小值。 最后直接访问d[en],即可得到最短距离。通过模板题...原创 2018-08-13 09:56:49 · 332 阅读 · 0 评论 -
匈牙利算法求最大匹配(HDU-4185 Oil Skimming)
如下图:要求最多可以凑成多少对对象大佬博客:https://blog.csdn.net/cillyb/article/details/55511666模板:int link[maxn],vis[maxn];bool dfs(int x){ for(int i = 1; i <= num; i++) { if(!vis[i] &&a...原创 2018-08-15 10:25:37 · 306 阅读 · 0 评论 -
博弈结论记录
一、巴什博奕:只有一堆n个物品,两个人轮流从中取物,规定每次最少取一个,最多取m个,最后取光者为胜。结论:见代码#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#define FRE() freopen("in.txt","r",st...原创 2018-08-07 16:09:43 · 186 阅读 · 0 评论 -
字典树--代码模板
查找该字符串是不是已经出现过//在给出的字符串中查找当前字符串是否出现过#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <cmath>#include <string>#include <...原创 2018-08-11 22:18:19 · 102 阅读 · 0 评论 -
树状数组--代码模板
用树状数组,在存数据的时候下标应该是从1开始的; 再求区间的和的时候和前缀和一样开始的下标是要减一的; toSum(int x)中再求前缀和的时候是倒着向前走的; 树状数组讲解:http://www.cnblogs.com/jinkun113/p/4725420.html ORZorzorz一看就明白了//树状数组修改值,求某区间的和#include <iostrea...原创 2018-08-11 22:14:39 · 365 阅读 · 0 评论 -
归并排序
自己对归并排序的理解:归并排序采用分治法来实现,将要排序的数组对半拆分,当拆分到单个元素的时候,在进行合并这时按照一定的顺序合并到临时数组temp中,最后在存入原来的数组中。代码:#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#incl...原创 2018-08-14 16:36:33 · 104 阅读 · 0 评论 -
拓扑排序
自己对拓扑排序的理解:例如:安排一些课程的顺序,这些课程有的可以放在一个学期内授课,而有的则有先后顺序,则可以通过拓扑排序来完成这个排序。有序无环图(DAG)才能进行拓扑排序。从图中找出没有入度顶点,存入答案序列中,并将以该点为起点的边从图中删掉。知道找完所有的点为止。图例:(从左往右看)第一步:取出1点或者4点,并将对应的边删掉(这里先取1点,具体的顺序根据实际情况来)得...原创 2018-08-14 14:58:01 · 408 阅读 · 0 评论 -
HDU-5968异或密码
超级传送门题目描述:晨晨在纸上写了一个长度为N的非负整数序列{ai}。对于这个序列的一个连续子序列{al,al+1,…,ar}晨晨可以求出其中所有数异或的结果 alxoral+1xor...xorar其 中xor表示位异或运算,对应C、C++、 Java等语言中的^运算。小璐提出了M个询问,每个询问用一个整数 xi描述。对于每个询问,晨晨需要找到序列{ai}的所有连续子序列,求出每个子...原创 2018-08-06 21:14:56 · 263 阅读 · 0 评论 -
康托展开
原理:举个例子来说明康拓展开的应用:已知1,2,3,4,5五个数的全排列,给出一个排列34152,问该排列在全排列中是第几个。而康托展开的值就是这个排名。首位是3,比它小而且没有出现过的数有1,2两个,所以为 2 * 4!; 第二位是4,比它小而且没有出现过的数有1,2两个,所以值为 2 * 3!; 第三位是1,没有比它小而且没有出现过的数,所以值为 ...原创 2018-08-10 20:27:46 · 94 阅读 · 0 评论 -
KMP--算法模板
sub[ ]代表子串,str[ ]代表原串,next[ ]代表当sub[i] != str[j]时,子串需要跳到的地方,实现代码如下:获取next数组的代码:void GetNext()//求子串中的相同的真前缀和真后缀{ memset(next, 0, sizeof(next)); next[0] = -1; int i = 0,j = -1; int...原创 2018-08-10 19:21:35 · 143 阅读 · 0 评论 -
欧几里得算法用法总结
当年没填起来的坑,迟早会再一次掉进去!!!想想还是将现在自己会用了的部分记录下来,以后再做补充。欧几里得算法: 到目前为止也只是用来求一下两个整数的最大公约数(感觉又是一个巨大无比的坑)。暂时先把这个用法记下来吧。//非递归实现long long gcd(long long a,long long b){ int temp; while(b) ...原创 2018-07-26 23:00:10 · 416 阅读 · 0 评论 -
欧拉函数
欧拉函数:(转自百度百科) 欧拉函数F(x)的作用:求从1到x与x互质的数的个数。直接求欧拉函数int euler(int n)//计算与n互质的数的个数{ int res = n,maxn = n; for(int i=2;i*i < maxn;i++) { if(n % i =...原创 2018-05-15 21:46:04 · 209 阅读 · 0 评论 -
唯一分解定理
唯一分解定理:任何一个大于1的自然数N,如果N不是质数,那么N可以分解成有限个素数的乘积;例:N=(p1^a1)*(p2^a2)*(p3^a3)......其中p1<p2<p3......在做 UVA10375 时学到了这个算法,虽然自己理解的还不透彻,先把自己的看法写下来,日后再完善;要用唯一分解定理第一步当然是素数打表了;之前素数打表一直用笨办法,翻了N多个题解后,看到了很...原创 2018-05-06 21:21:58 · 829 阅读 · 6 评论 -
LIS(两种方法求最长上升子序列)
首先得明白一个概念:子序列不一定是连续的,可以是断开的。有两种写法:一、动态规划写法复杂度:O(n^2)代码:#include <iostream>#include <queue>#include <cstdio>#include <algorithm>#include <cmath>#include &l...原创 2018-09-30 19:08:39 · 268 阅读 · 0 评论