
板子
Lngxling
这个作者很懒,什么都没留下…
展开
-
kmp
原文链接 http://www.cnblogs.com/SYCstudio/p/7194315.html原作者 @SYCstudioKMP算法(研究总结,字符串)KMP算法(研究总结,字符串)前段时间学习KMP算法,感觉有些复杂,不过好歹是弄懂啦,简单地记录一下,方便以后自己回忆。引入首先我们来看一个例子,现在有两个字符串A和B,问你转载 2017-09-23 20:00:00 · 252 阅读 · 0 评论 -
最长回文子串——Manacher 算法
0. 问题定义最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果一个字符串正着读和反着读是一样的,那它就是回文串。下面是一些回文串的实例:12321 a aba abba aaaa tattarrattat(牛津英语词典中最长的回文单词)1. Brute-force 解法对于最长回文子串问题,最简单粗暴的办法是:找到字符串的所有子串,遍历每一个子串以转载 2017-10-15 20:07:18 · 232 阅读 · 0 评论 -
STL中的二分查找函数
头文件 查找函数可以分为两类① count find 用于非有序序列的查找,On的复杂度。② binary_search upper_bound lower_bound equal_range 用于有序序列的查找,Ologn的复杂度。① count(num,num+n,w);count(v.begin(),v.end(),w);返回值是一个数,代表从起始到结束原创 2017-11-08 20:52:03 · 537 阅读 · 0 评论 -
康托展开及其逆运算 详解
康托展开是什么?定义:X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0!ai为整数,并且0简单点说就是,判断这个数在其各个数字全排列中从小到大排第几位。比如 132,在1、2、3的全排列中排第2位。康托展开有啥用呢?维基:n位(0~n-1)全排列后,其康托展开唯一转载 2017-10-14 16:41:21 · 389 阅读 · 0 评论 -
位运算详解及竞赛常见用法入门
位运算程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。转载 2017-09-11 16:57:22 · 236 阅读 · 0 评论 -
将字符串中的数字转化为整数(string->int)
将每个字符乘10的倍数的方法太缓慢且局限性太多,用sscanf和sprintf晦涩难记且不稳定。所以有了stringstream,需包含头文件sstream.将字符串s中的数字复制到tmp中,每次遇到非数字就转化。#include #include using namespace std;string s,tmp;stringstream ss;int num;i原创 2017-11-20 19:59:57 · 2685 阅读 · 2 评论 -
博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈,sg函数)
原文:http://blog.youkuaiyun.com/ac_gibson/article/details/41624623一. 巴什博奕(Bash Game): A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30。这应该是最古老的关于巴什博奕的游戏了吧。其实如果知道原理,这游戏一点运气成分都没有,只和先手后手有关,比如第一次报数,A报k个数,那么B报5-k个数,那转载 2017-11-23 12:10:20 · 425 阅读 · 0 评论 -
数论模板
1. 辗转相除法(欧几里得除法)int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}或者c++直接用函数__gcd()2.扩展欧几里得int exgcd(int a,int b,int &x,int &y){ if(b==0) { x=1; y=0; return a; } int k=ex...原创 2018-04-15 21:51:48 · 363 阅读 · 0 评论 -
二维线段树
一维线段树用来维护一维的空间,即一个线段。二维线段树用来维护二维的空间,即一个矩形。 二维线段树的每个结点都是一棵一维线段树,所以结构体数组要开二维,再加上线段树本身的性质,会占用很大内存,要尽量减少结构体内存储的值的个数和长度,考虑到每个节点表示的线段的左右端点可以作为函数参数,所以不再储存在结构体内部,若题目只需保存一个值,完全可以只开一个数组而不使用结构体。第一维树维护...原创 2018-07-27 19:10:06 · 1974 阅读 · 2 评论 -
莫比乌斯反演
莫比乌斯反演 略微学了一点皮毛,先记录下来以备复习。反演分为两种形式:①约数型对于等式 可以得到 ②倍数型对于等式 可以得到 u函数的性质决定了莫比乌斯反演的本质是容斥原理。一般情况下,我们要求的 f 函数很复杂,不便直接求出,但我们可以构造出一个与其有关的 F 函数,而 F 函数相比来说比较容易求出,这样我们可以通过F函数的反演求...原创 2018-08-07 20:57:18 · 252 阅读 · 0 评论 -
二分查找及其变种总结
1 二分查找 二分查找是一个基础的算法,也是面试中常考的一个知识点。二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。(图片来自《算法-第4版》)/** * 二分查找,找到该值在数组中的下标,否则为-1 */static int binarySe转载 2017-10-12 17:34:49 · 1679 阅读 · 0 评论 -
c++ map
1、map简介map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。2、map的功能自动建立Key - value的对应。key 和 value可以是任意你需要的类型。 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次转载 2017-09-12 21:26:45 · 217 阅读 · 0 评论 -
树状数组——三种用法详解
树状数组树状数组可以视为线段树的一个分枝 树状数组能做的题 线段树基本都能做但线段树的代码量比较少 容易实现思想用lowbit 动态维护某一区间的和 求lowbit: lowbit= k & (-k);在维护和求值时用到了二分的思想线段树的题基本可以分三种情况 1.点更新 区间查询 2.区间更新 点查询 3.区间更新 区间查询一,点更新 区间查询(最基本的用法) 在这种用法中 c原创 2017-08-07 21:45:16 · 584 阅读 · 2 评论 -
奇偶剪枝
什么是奇偶剪枝? 把矩阵看成如下形式: 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 从为 0 的格子走一步,必然走向为 1 的格子 。 从为 1 的格子走一步,必然走向为 0 的格子 。 即: 从 0 走向 1 必然是奇数步,从 0 走向 0 必然是偶数步。所以当遇到从 0 走向 0 但是要转载 2017-07-29 19:17:47 · 403 阅读 · 0 评论 -
拓扑排序
拓扑排序——常用于有向图中 完成任务A 需先解决其先决事件的问题 要想解决事件A 需先解决其先决事件 可以用图中点的入度来表示 储存图用邻接表或者邻接矩阵 先顺序访问所有入度为0的顶点 并添加进队列 不断将下一顶点的入度-1 使点的入度变为0 深搜和广搜都能实现拓扑排序 时间复杂度为O(|V|+|E|) 但大规模图容易引起栈溢出 所以不涉及递归的广搜更合适些 例题:E - 确定比赛名次&&G原创 2017-07-29 17:28:42 · 259 阅读 · 0 评论 -
vector
vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: 首先在程序开头处加上#include<vector>以包含所需要的类文件vector 还有一定要加上using name转载 2017-07-29 17:09:02 · 371 阅读 · 0 评论 -
二叉树的遍历
原题链接:F - 二叉树的遍历 给出一棵二叉树的中序和前序遍历,输出它的后序遍历。 Input 本题有多组数据,输入处理到文件结束。每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点。接下来的一行每行包括n个整数,表示这棵树的中序遍历。接下来的一行每行包括n个整数,表示这棵树的前序遍历。3<= n <= 100Output 每组输出包括一行,表示这棵树的后序遍历。 Sample原创 2017-07-29 17:01:50 · 268 阅读 · 0 评论 -
单调栈
单调栈—可用于从某点处向左向右扩展到符合条件的值问题的优化 这类题目 暴力的方法需要n2的复杂度 往往会被T 用单调栈可以将问题简化成n思想:通过维护一个单调的栈将满足条件左||右端点找出来函数:s.size( ) s.push( ) s.pop( ) s.top( ) 题目:数据结构训练一D - Feel Good &&E - Bad Hair Day qduojLC的课后辅导原创 2017-07-19 12:03:20 · 266 阅读 · 0 评论 -
并查集
并查集—常用来解决有关求连通分支的问题思想:用一个pre[n]数组将各个点联系起来函数:find(int x) join(int x,int y)int find (int x)//递归定义 { return pre[x]==xx:pre[x]=find(pre[x]);}int find(int x)//通常定义 { int r=x; wh原创 2017-07-18 21:39:46 · 222 阅读 · 0 评论 -
堆——优先队列
堆——优先队列 堆是一种特殊的完全二叉树(父节点都比子节点大或小) 顺便说一下二叉树 如果共有n个节点 则树的高度为logN 父节点是第k个节点 则左儿子是2k 右耳子是2k+1最小堆 父节点都要比子节点小 根的值一定是最小的 其他的值的顺序无法确定 最大堆相反 优先队列 思想:由最小堆或者最大堆实现 并通过堆排序保持队列的有序性 模拟队列的结构函数:pq.pop( ) pq.push原创 2017-07-19 15:35:33 · 307 阅读 · 0 评论 -
背包板子总结
01背包int V;//背包最大容量int w[max_],v[max_];//v为价值 w为重量int dp[max_];for(i=1;i<=n;i++){ for(j=V;j>=w[i];j--) dp[j]=max(dp[j],dp[j-w[i]]+v[i]);}完全背包①int V;//背包最大容量int w[max_],v[max_];//v为价值原创 2017-09-28 11:25:55 · 418 阅读 · 0 评论 -
大数模板
java中大数开方(被开方数不超过1000位)import java.util.*;import java.math.*; public class Main{ public static void main(String[] args) { Scanner cin=new Scanner(System.in); ...原创 2018-09-15 20:02:56 · 245 阅读 · 0 评论