
ACM常用算法及模板整理
文章平均质量分 81
把一些容易忘的算法知识以及题目常用到的模板整理到该专栏,便于复习,巩固。
同学少年
没有什么不可能!
展开
-
[数据结构] 表达式求值(转化为后缀表达式再求值或直接求值)
两种情况:1. 根据输入的算数表达式,如(56-20) /(4+2), 先转化为后缀表达式(逆波兰式)56#20#-4#2#+/ 因为输入的数字有多位数的(56),所以数之间用#隔开,然后根据后缀表达式求值。2.根据输入的算数表达式,直接进行求值。对于情况1:转化为后缀表达式时用到了一个符号栈,把后缀表达式存放到数组postExp中,根据后缀表达式求值时用到了一个运算数栈原创 2016-03-05 17:23:04 · 5278 阅读 · 0 评论 -
[剑指offer] 重建二叉树,根据前中,输出后,根据中后,输出前
参考:《剑指offer》纪念版情况1.:给出树的前序序列和中序序列,输出后序序列情况2 :给出树的后序序列和中序序列,输出前序序列解决方法:根据所给出的两个序列,构造出(重建)二叉树,然后按要求再遍历输出。重建二叉树主要利用了递归的思想,最重要的是找出序列的范围(函数传参),这个要非常仔细,很容易出错。一定要在纸上画出图,然后根据图来确定范围。用到的两个函数:以情况原创 2016-03-04 11:20:30 · 1854 阅读 · 0 评论 -
[ACM] 常用STL
1. stackstackst;//栈st,用于存放int型数据st.push(3);//将3入栈st.push(2);//将2入栈st.pop();//栈顶2出栈int Top = st.top();//获取栈顶元素,即3int Size = st.size();//求栈中的元素个数bool isEmpty = st.empty(); //栈中元素是否为空,1表示空,0表示非空原创 2016-03-01 19:10:18 · 3554 阅读 · 0 评论 -
[ACM] 常数和语言基础
1. 数据表示范围 unsigned int 0~4294967295 int 2147483648~2147483647 unsigned long 0~4294967295long 2147483648~2147483647long long的最大值:9223372036854775807long long的最小值:-92233720368547758原创 2016-02-17 17:26:27 · 2779 阅读 · 0 评论 -
最小生成树专题
专题地址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66965#overviewA 裸的最小生成树,Kruskal算法。#define rd(x) scanf("%d",&x)#define rd2(x,y) scanf("%d%d",&x,&y)#define rd3(x,y,z) scanf("%d%d%d",&x原创 2015-03-25 16:05:19 · 2108 阅读 · 0 评论 -
KMP · 扩展KMP · Manacher 专题
涉及到的知识点:KMP,扩展KMP,Manacher算法,最小最大表示牢记住:next[i]表示前i个字符所组成的字符串的最大前后缀匹配长度。Number Sequencehttp://acm.hust.edu.cn/vjudge/contest/view.action?cid=70325#problem/判断一个字符串是否在另一个字符串中出现,如果出现,则输出最小的位置,否则原创 2015-03-20 16:59:06 · 2634 阅读 · 0 评论 -
线段树专题
hdu 1166 敌兵布阵单点更新,区间查询和。http://acm.hdu.edu.cn/showproblem.php?pid=1166#define rd(x) scanf("%d",&x)#define rd2(x,y) scanf("%d%d",&x,&y)#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)using namespa原创 2015-02-19 20:31:36 · 2213 阅读 · 0 评论 -
[动态规划] 最长递增子序列 (Longest Increasing Subsequence)
1.复杂度为O(n^2)const int maxn=100020;const int inf=0x3f3f3f3f;int dp[maxn];//以a[i]为结尾的最长自增子序列长度int a[maxn];int n;int LIS(int a[],int n)//最长上升子序列{ int m; dp[0]=1; for(int i=1;i<n;i++)原创 2014-12-23 11:56:22 · 2196 阅读 · 0 评论 -
[数论] Miller_Rabbin算法判断大素数,Pollard_rho算法进行质因素分解
讲解转载于:http://www.cnblogs.com/rainydays/archive/2011/09/01/2162049.html http://blog.sina.com.cn/s/blog_86a9d97201015cj7.htmlMiller-rabinMiller-rabin算法是一个用来快速判断一个正整数是否为素数的算法。它利用了费马小定理,即:如果p是质数,且原创 2014-12-23 10:43:37 · 3746 阅读 · 0 评论 -
[图论] 二分图匹配(匈牙利算法)
介绍部分转载于维基百科:匈牙利算法是众多用于解决线性任务分配问题的算法之一,是用来解决二分图最大匹配问题的经典算法,可以在多项式时间内解决问题,由美国数学家Harold Kuhn 于1955年提出。此算法之所以被称作匈牙利算法是因为算法很大一部分是基于以前匈牙利数学家Dénes Kőnig和Jenő Egerváry的工作之上创建起来的.问题简介:设G=(V,E)是一个无向图。如顶原创 2014-12-10 11:13:44 · 2941 阅读 · 0 评论 -
[图论] LCA(最近公共祖先)Tarjan 离线算法
很好的参考资料:http://taop.marchtea.com/04.04.html 下面的配图和部分文字转载于此文章离线算法就是指统一输入后再统一输出,而不是边输入边实时输出。Tarjan算法的复杂度为O(N+Q),Q为询问的次数.由于是离线算法,所以要保存输入的信息,次序问题。 若两个结点u、v分别分布于某节点t 的左右子树,那么此节点 t即为u和v的最近公共祖先。更进原创 2014-12-09 21:19:27 · 4138 阅读 · 1 评论 -
[图论] 有向图强连通分量 (kosaraju算法,Tarjan算法)
记录自己的想法:在有向图中,如果一些顶点中任意两个顶点都能互相到达(间接或直接),那么这些顶点就构成了一个强连通分量,如果一个顶点没有出度,即它不能到达其他任何顶点,那么该顶点自己就是一个强连通分量。在用kosaraju算法和Tarjan算法求强连通分量的时候,就是给所有的顶点分组染色,同一种颜色的顶点在同一个强连通分量中,记录有多少种颜色(有多少个强联通分量),每个顶点属于哪种颜色(每个顶点在哪原创 2014-12-09 09:46:02 · 5068 阅读 · 0 评论 -
[数论] 高斯消元(整型和浮点型)
高斯消元法:数学上,高斯消元法(或译:高斯消去法)(英语:Gaussian Elimination),是线性代数中的一个算法,可用来为线性方程组求解,求出矩阵的秩,以及求出可逆方阵的逆矩阵。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。(来自维基百科)构造如下方程:a[0][0]*X0 + a[0][1] *X1 + a[0][2]*X2+...........a[0][n原创 2014-11-27 19:42:27 · 3611 阅读 · 0 评论 -
[数据结构] 字典树
字典树百度百科:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。学习了字典树之后,觉得它很明显的就是用空间来换时间,空间复杂度特别大,比如字典数单单存26个小写字母,那么每个节原创 2014-11-21 11:52:23 · 2780 阅读 · 0 评论 -
[数据结构]线段树
hihocoder上的这一篇文章写得特别赞!很好理解。“在我介绍别的算法之前,你先来讲一讲你是准备如何使用线段树来解决这个问题的吧?”小Hi虽然做好了讲解的准备,但是还是希望能够一步步引导小Ho进行思考,于是这般说道。“唔……那我先从线段树的定义说起吧:线段树其实本质就是用一棵树来维护一段区间上和某个子区间相关的值——例如区间和、区间最大最小值一类的。”小Ho说道:“它的具体做原创 2014-11-18 20:57:42 · 1994 阅读 · 0 评论 -
[数论]素数相关整理
1.单独判断一个数是否为素数bool prime(int n){ if(n==0||n==1) return false; if(n==2) return true; for(int i=2;i<=sqrt(n);i++) if(n%i==0) return false; return true;}原创 2014-11-12 10:00:43 · 3279 阅读 · 0 评论 -
[组合数取模] 方法汇总
1.利用整数唯一分解定理,求(n+1-m) * (n+m)! / ( m! * (n+1)! )任何正整数都有且只有一种方法写出其素因子幂相乘的形式。比如18= 2 * 3^2A=(p1^k1)*(p2^k2)*(p3^k3)*(p4^k4)*......*(pn^kn) pi为素数还有把阶层看作一个数,比m! 怎样求m!里面素数2的指数呢?cnt=0; while(原创 2014-11-11 20:35:41 · 2341 阅读 · 0 评论 -
[动态规划] 01背包与完全背包
01背包(每种物品的状态为选择或不选择,最多只能选1件):1.传统的二维数组,第i件物品的重量为w[i],价值为v[i]dp[i][j]保存的是选择前i件物品(每一件物品的状态为选与不选),在背包容量为j的情况下,可以获得的最大价值两种情况:一.当前背包容量j二.当前背包容量j>=第i件的重量时,第i件背包可以选,能放得下去,但因为要考虑到所获得最大价值,所以这时候有两种选原创 2014-11-08 09:40:57 · 3116 阅读 · 0 评论 -
[图论] 最短路径(Bellman-Ford , SPFA , Floyed , Dijkstra)
注:模板以hdu 2544 为例Problem Description在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input输入包括多组数据。每组数据第一行是两个整数N、M(N原创 2014-11-07 20:26:34 · 3621 阅读 · 0 评论 -
[组合数学] 第一类,第二类Stirling数,Bell数
一.第二类Stirling数 定理:第二类Stirling数S(p,k)计数的是把p元素集合划分到k个不可区分的盒子里且没有空盒子的划分个数。 证明:元素在拿些盒子并不重要,唯一重要的是各个盒子里装的是什么,而不管哪个盒子装了什么。 递推公式有:S(p,p)=1 (p>=0) S(p,0)=0 (p>=1) S原创 2014-11-07 10:32:57 · 10474 阅读 · 1 评论