
数据结构
acm_lkl
这个作者很懒,什么都没留下…
展开
-
并查集
ACM之并查集(2011-07-31 20:05:22)转载▼标签:杂谈分类:数据结构并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?)来看一个实例,杭电1232畅通工程ht转载 2014-07-24 20:35:52 · 424 阅读 · 0 评论 -
UVA 11997--K Smallest Sums+优先队列用于多路归并
题目链接:点击进入 先考虑两个数组A,B的情况,这样总共有n^2种情况;将A,B数组排序后,我们可以将所有情况组织成n张表: 表1: A[1]+B[1]<=A[1]+B[2]<=……<=A[1]+B[n]. 表2: A[2]+B[1]<=A[2]+B[2]<=…….<=A[2]+B[n]. ……. 表n: A[n]+B[1]<=A[n]+B[2]<=……..<=A[n]+B[n] 这n张原创 2015-06-13 13:12:25 · 1406 阅读 · 0 评论 -
UVALive 3027---Corporative Network+并查集的应用
题目链接:点击进入 其实就是一道水题,只要用一下并查集的路径压缩思想就行了.值得注意的是并查集压缩的顺序,我们只能在回溯的过程中进行压缩.代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 22000int fa[maxn],原创 2015-06-16 15:06:43 · 740 阅读 · 0 评论 -
poj--2019Cornfields+二维RMQ问题
题目链接:点击进入 就是一个二维的RMQ问题,其实二维线段树或则是树状数组都是可以做的,但是二维的ST算法编码还是要简单一点。下面这份代码可以作为二维ST算法的模板用。代码如下:#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;int val[255原创 2015-08-09 10:45:44 · 904 阅读 · 0 评论 -
poj--2778DNA Sequence+AC自动机+矩阵快速幂
题目链接:点击进入 如果我们先将所有的病毒字符串构建成一棵trie,然后构建一个n长的字符串的过程可以看成是从这颗trie树根节点出发走n步的一个过程,为了不含任何的病毒,则在走的过程中不能经过任何的病毒节点。考虑只走一步的过程,则我们可以得到一个矩阵m[i][j],表示从节点i到节点j有多少种方式。那么这个矩阵的n次幂就是表示走n步的情况,然后也就可以得到答案了。 问题在于如何获得这个走一步方原创 2015-08-24 15:48:32 · 1311 阅读 · 0 评论 -
hdu-5384Danganronpa+多校训练+AC自动机
题目链接:点击进入 其实就是一个很简单的AC自动机的题目,只是需要注意下在记录查询的字符串时,需要将他们连成一个整体进行记录,否则数组是开不下的。代码如下:#include<iostream>#include<cstring>#include<cstdio>#include<queue>using namespace std;#define ll long longconst int m原创 2015-08-22 09:28:54 · 1256 阅读 · 1 评论 -
poj--1625Censored!+AC自动机上的dp+大数
题目链接:点击进入 其实看起来是完全可以用矩阵做的,但是因为用到了大数的,导致内存开不下,所以用dp写了。其实dp的过程依旧就是在我们用禁止出现单词构建的trie上走m步的过程。我们定义dp[i][j]表示走过i步以后到达节点j的方案数,则状态转移应该是dp[i][j]=sum(dp[i-1][k]),其中k表示可以走到j的节点,并且不能是病毒节点。但是其实这样代码就不是那么好写了,其实我们可以用原创 2015-08-25 13:28:59 · 923 阅读 · 0 评论 -
树链剖分模板+入门题 SPOJ - QTREE
题目链接:[点击进入](http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=13013) 树链剖分并不是一个复杂的算法或者数据结构,只是能把一棵树拆成链来处理而已,换一种说法,树链剖分只是xxx数据结构/算法在树上的推广,或者说,树链剖分只是把树hash到了几段连续的区间上。比如说下面这道题,就是将树分为重链和轻链然后映射到线段树原创 2015-08-13 09:17:34 · 926 阅读 · 0 评论 -
Poj--3080Blue Jeans+KMP水题
题目链接:点击进入 大概的题意就是给n个字符串,然后让我们找出他们的最长的公共子串。 因为题目的数据比较小,我们可以枚举第一个串的所有子串,然后再用KMP判断一下这个子串是否出现在其它字符串中。代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=100;///x原创 2015-08-16 10:45:30 · 986 阅读 · 0 评论 -
POJ--2406Power Strings+KMP求字符串最小周期
题目链接:点击进入 其实就是KMP算法next数组的简单应用。如果我们设这个字符串的最小周期为x 长度为len,那么由next数组的意义,我们知道len-next[len]的值就会等于x。这就是这个题目的关键点。代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=原创 2015-08-16 16:01:32 · 886 阅读 · 0 评论 -
POJ 2752+KMP+利用next数组性质求出所有相同的前缀和后缀
题目链接:点击进入 这个题目要求所有相同的前缀和后缀的长度。我们可以利用KMP算法中next数组的性质,在next[len]这个点不断的失配下去,这样就可以将所有相同的前后缀的长度求出来。还要注意这个中整个串的长度也可以看成是一个合法的解。代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;c原创 2015-08-16 16:57:40 · 1709 阅读 · 0 评论 -
hdu2222--Keywords Search+AC自动机模板
题目链接:点击进入 KMP对模式串进行处理,然后就可以方便的判断模式串是否在目标串中出现了;这显示适合一个模式串多个目标串的情况。但是如果模式串有多个,这时如果还用KMP则需要对每个串都进行一次处理,显然不是很合适。其实这时候可以将所有模式串建成一棵trie树,然后采用类似于kmp的方法计算出failed指针,也就可以方便的进行匹配了。其实这就是ac自动机的思想。代码如下:#include<ios原创 2015-08-17 14:15:29 · 1003 阅读 · 0 评论 -
划分树模板+模板题--hdu4251
题目链接:点击进入 划分树解决的是快速求区间中第k大值的问题,算法的主要思想是基于线段树和快排的划分方法,可以实现在logn时间内求出任意区间的第k大值。下面这份代码是基于hud4251的一份模板。 代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;原创 2015-08-07 13:21:18 · 874 阅读 · 0 评论 -
hud--4251The Famous ICPC Team Again+划分树入门题
题目链接:点击进入 这次求得是给定区间的中值,所以还是直接可以套划分树的模板。代码如下:#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int maxn=100000+100;int tree[20][maxn];int sorted[maxn]原创 2015-08-07 14:25:50 · 632 阅读 · 0 评论 -
UVA 11020 Efficient Solutions+multiset的应用
题目链接:点击进入 首先来讲,很容易看到我们其实只要维护优势人群的集合;如果加入一个新的人,我们首先看一下优势人群中是否有人会让这个人失去优势,如果没有,则将这个人插入集合中,但要注意到这个人的插入可能会让其它的人失去优势。所以要求这个集合要能支持快速查询和修改操作;而multiset恰好能能满足这个需要。 代码如下:#include<iostream>#include<cstdio>#in原创 2015-08-07 09:57:08 · 855 阅读 · 0 评论 -
hdu--4417Super Mario+划分树
题目链接:点击进入 这道题就不能简单的套模板了,因为他是要判断给定的区间里有多少个值小于H。思路看完题后就有了,其实我们只要二分名次k,然后将得到的值与H进行比较就行了,这样就可以求出一个高度恰好小于H的名次作为答案了。但要注意一下,使用划分树求出的第k大值,其实是第k小值,开始就被被这一点坑了。代码如下:#include<iostream>#include<cstdio>#include<c原创 2015-08-07 16:43:01 · 552 阅读 · 0 评论 -
UVA 11235--Frequent values+RMQ问题
题目链接:点击进入 以前也碰到过不需要修改,只需要单纯查询区间最值的题目,那时候都是用的线段树做的。但是现在大白书上提供了一个更好的算法。 当然这个题目本身还是不能直接套最大最小值的模板的,需要做一些转换。其中最主要的就是要将题目给的数据,处理成(a,b)这种格式,表示数字a连续出现b次,并且记录每个编号对应的段号。然后我们在处理过后的以段为表示单位的数据上进行RMQ查询了。代码如下:#incl原创 2015-07-02 19:13:23 · 1021 阅读 · 0 评论 -
UVALive 3135--Argus+自定义优先队列的优先规则
题目链接:点击进入 只是题意比较难懂,读懂题后完全可以用优先队列水过去.这次学会自定义优先队列的优先规则,其实就是在结构体中重载一下<运算符.代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;typedef struct原创 2015-06-10 13:55:37 · 943 阅读 · 0 评论 -
数据结构课设
/*10、多种基本内排序方法的实现问题描述:设计一个合成的排序程序。可供排序的方法是:插入排序、快速排序、归并排序、堆排序。要求程序具有(1)显示排序结果.(2)提供最好和最坏情况下对比计时的功能。(3)提供在不同数组元素的个数情况(当N分别等于100,1000,5000,20000时)下各种排序算法的计算时间的统计功能。*/#include#include#include原创 2014-07-15 23:25:59 · 1826 阅读 · 0 评论 -
uva--10050+链表模拟
题目大意: 给定一个参数h表示两原创 2014-10-14 14:53:30 · 572 阅读 · 0 评论 -
poj--2752Seek the Name, Seek the Fame KMPnext数组的应用
题目可以装换成求以最后一个字符结尾的与某一前缀相同的所有后缀的长度;所以需要利用KMP函数中next数组的性质。 我们可以先求出前n-1个字每的next值,然后再求出第n个字母所有可能的(而不是最长的)next值。 当然我们可以先求出所有字母的next值,然后再倒着扫一遍,即next[len],next[next[len]]……..。这样也可以将所有的长度求出来。 注意每一个串的本身是满足一定原创 2015-02-07 17:47:30 · 618 阅读 · 0 评论 -
poj2406--Power Strings+KMP求周期
先把结论摆出来:对于长为j的字符串str[1..j],next[j]=k,则令d=j-k;如果j%d==0,则这个字符串是一个周期串,前d个字符是其最小的循环结,共包含j/d个循环节。现在来解决两个问题:1)前d个字符是其循环结 下标 1 2 3 4 5 6 7 8 字符串 a b a b a b a b原创 2015-02-07 15:49:49 · 726 阅读 · 0 评论 -
poj--3080Blue Jeans KMP的简单应用
穷举第一个字符串的所有子串,然后再判断其是否是其它字符串的子串。 然后注意输出字典序最小的答案。 判断枚举的子串是不是其它字符串子串时可以使用KMP,其实也可以直接暴力,因为题目数据范围不大。 学到一个技巧:可以使用memset(str,’\0’,sizeof(str)将字符数组清空。 还有一点需要注意的是在自己组合的字符串后面一定要记得加上字符串结束标志’\0’。代码如下:#include原创 2015-02-08 12:45:34 · 794 阅读 · 0 评论 -
poj--3450 KMP求多个字符串的最长公共子串
思路与前面的3080一样代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;char str1[220],str2[220];int next[220],n;char ch[4400][220];void GetNext(){ int j=0; int len=strlen原创 2015-02-08 13:28:22 · 1638 阅读 · 0 评论 -
poj--3630+字典树基础题
先按长度排序,先先插入长的,在插入的时候同时进行查询。#include#include#include#includeusing namespace std;typedef struct{ char str[12];}P;P p[200000];bool cmp(P p1,P p2){ if(strlen(p1.str)>strlen(p2.str))原创 2015-02-16 19:02:07 · 686 阅读 · 0 评论 -
poj--2503+字典树入门题
字典树入门题将字符串结尾的标记为一个字符串,然后就可以用字典树的插入和查找了代码如下:#include#include#includeusing namespace std;#define maxn 26typedef struct{ char str[13]; int next[maxn];}N;N node[300001];int原创 2015-02-15 22:47:17 · 1228 阅读 · 0 评论 -
coj--1532: JuQueen+线段树
很久没写线段树了,没想到这两场比赛都遇到了线段树的题目。看来是有必要重新复习一下了。。。。。 对于这道题的话其实就是线段树,我们只需要维护一下区间的最小值和最大值就可以应对题目的问题了。代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define maxn 5000000#define原创 2015-03-25 23:42:51 · 621 阅读 · 0 评论 -
线段树模板
下面的两份线段树模板,一份是单点更新维护区间最小值,一份是区间更新,同时维护区间和,区间最大最小值。代码如下:///线段树单点更新#include<iostream>#include<cstdio>#include<cstring>#include<fstream>using namespace std;#define maxn 1000#define INF 0x3f3f3f3fint原创 2015-03-25 23:47:13 · 607 阅读 · 0 评论 -
CSUOJ--1563: Lexicography
这个题目就是求一个序列的第k个字典序排序,因为k比较大所以我们不能穷举,而是用其它的方法求。代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define ll long longchar str[20];int cc[30];ll fac[20],k;ll GetNum(int cnt原创 2015-04-06 20:13:08 · 674 阅读 · 0 评论 -
CUSOJ1170--A Simple Problem
这个题目如果直接暴力枚举连续子区间是肯定会超时的;其实枚举子区间的时候会有很多重复的计算,我们可以利用这个性质.假设我们现在我们枚举起点为i,终点为j-1的区间是满足要求的,但是由于a[j]的值大于最大值或小于最小值,导致Max-Min>k,那么如果我们是暴力枚举的话,我们会将起点设为i+1然后继续枚举,但是其实如果a[i+1]点的值没有改变最大值或最小值则区间的终点仍然是j,不会得到一个更优的解.原创 2015-05-15 16:13:17 · 644 阅读 · 0 评论 -
CSUOJ1238--兵临城下
这个题目的难点在于p操作时快速确定没预热炮中的最小编号.我是用线段树为每门炮维护了一个最后可开炮时间,然后每次需要预热一门炮时就用二分加线段树查询满足要求的最小编号.要注意如果一门炮可以开炮时间的结尾恰好是我们查询的时间,我们也要将其看成不可以开炮需要重新预热的(我就在这WA了好几发).代码如下:#include<iostream>#include<cstdio>#include<cstring原创 2015-05-16 17:09:06 · 689 阅读 · 0 评论 -
UVALive 4329--Ping pong+树状数组
题目链接:点击进入 开始的时候想着枚举两个比赛的选手,然后再求在他们中间有多少个满足要求的裁判,但是这样时间复杂度就不可能满足题目的要求.后面觉得可以枚举每个人做裁判的情况;假设第i位选手做裁判,然后设其左边1–i-1中有lmin[i]个人的排名比他低,则有i-1-lmin[i]个人的排名不比他低,设其右边i+1–n中有rmin[i]个人的排名比他低,则有n-i-rmin[i]个人的排名不比他低.原创 2015-06-19 18:06:42 · 552 阅读 · 0 评论 -
UVA11991--Easy Problem from Rujia Liu?
题目链接:这里写链接内容数据结构水题,用vector记录每个元素所有出现的位置.(其实也可以用map做,只要map的第二维声明为vector就行).代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;#define maxn 1100000vector<int原创 2015-06-09 19:21:04 · 487 阅读 · 0 评论 -
poj--3264Balanced Lineup+ST算法求区间最大最小值
题目链接:点击进入 其实这种动态查询区间最大最小值的题目,解法是有很多的,像是线段树和树状数组都是可以做的。ST算法效率和上面两种是一样的,但是编码更为简单。 ST算法是一种利用了递推思想进行计算的算法,令dp(i,j)表示从i开始长度为2^j的一段元素中的最小值,则dp(i,j)=min(dp(i,j-1),dp(i+2^(j-1),j-1))。这是求区间最小值的递归关系,其实求区间最大值也是原创 2015-08-08 11:09:17 · 899 阅读 · 0 评论