![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
acm_数据结构
文章平均质量分 61
lshacm
这个作者很懒,什么都没留下…
展开
-
uva1401 前缀树
题目大意:用一个字符串集合中的若干字符串拼接成一个已知字符串,问有多少种拼接方法解法:动态规划dp[i]:表示已知字符串[i,l]字符区间最多的拼接方法,则dp[i]=sum(dp[j+1]) (i妙处:用动态规划方法将字符串拼接个数问题转化为字符串相等判断问题。动态规划此处应用的特点:化无序为有序。将无序的拼接转化为有序的前缀1.在字符串集合(共n个字符串,每个长度普通方原创 2015-01-30 17:43:02 · 274 阅读 · 0 评论 -
最长回文子串
关键词:manacher算法预处理以每个字符为中心的最长回文半径p[i].mx是前以i个元素为中心回文串的最右边界,id是该回文串的中心下标。则2*id-i是i关于id的对称点。关键代码如下:if(mx>i) p[i]=min(mx-i,p[2*id-i]);else p[i]=1;但是这种方法只能求长度为奇数的回文串长度,于是将原串扩增,wwaww->@#w#w#a#w#w#原创 2015-01-03 23:37:00 · 238 阅读 · 0 评论 -
《浅谈数据的合理组织》笔记
关键词:树结构->线性结构、倒序dp、背包问题初始化、第二类线段树例一:(vjios1642) 树中每个点有一个权值,求不超过m点且满足性质P的最大权值点集,性质P:点集中任一点的父节点一定也在点集中。做法:将树结构线性化。dfs性质:dfs遍历后子树在一个以根为起始点的连续区间内前根遍历,得到数组line[],记录元素i的子树区间结束点(即子树元素个数)sum[i],设dp[i]原创 2015-01-03 12:31:54 · 367 阅读 · 0 评论 -
hdu5157 不交叉回文对统计
关键词:manacher算法、统计以第i个字符为起点/终点的回文串个数!将新数组的元素扫描一遍,标记需要更新点的起始和末了位置,起点++,终点--,最后统计以第i个字符为起点的数量时,将前i个累加起来即可。因为在[起点,终点]区间的元素都加上了起点的那个1,不在[起点,终点]区间的元素由于终点-1,因此没有加到终点的那个1。本题需要考虑奇偶分类和边界调节考虑等,十分繁杂,代码无力Orz...原创 2015-01-04 01:46:47 · 388 阅读 · 0 评论 -
uva11235 RMQ
一段不减序列a1,a2...an,对于任意询问(i,j),回答ai,a(i+1)...aj中出现次数最多的值所出现的次数按照不同值将序列分为若干段,记录相关数组,并用RMQ进行询问。#include#include#includeusing namespace std;const int maxn=100000+10;const int maxlog=20;//区间最大值原创 2015-02-10 12:01:28 · 290 阅读 · 0 评论 -
uva11997 ADT
从k个数组(每个数组中k个元素)中各任取一个元素求和,得到k^k个元素。从小到大输出前k个合并后的元素。常规做法:将所有元素求和排序,O((k^k)*log(k^k)),超时巧妙做法:结论:将数组两两合并后的结果不变证明:两两合并后再与另一个数组合并且为三个数合并的结果,所以数值不变题目简化为求两两合并后前k个合并后的元素结论:将k个有序表(每个表含m个元素)合并(插入后仍原创 2015-02-03 12:21:00 · 247 阅读 · 0 评论 -
hakerrank <Maximise Sum> set
关键词:前i-1个数中大于a[i]的最小值题意:n个数,求模m的最大子序列(连续)和 已知n和m做法:1.预处理sum[i]=sum[i]%m(>0)以第i个元素结尾的模m最大子序列和=max{sum[i],((sum[i]-x)%m+m)%m},x是前i-1个数大于sum[i]的最小值如何维护前i-1个数种大于a[i]的最小值?——set#include#inc原创 2015-04-15 21:24:32 · 240 阅读 · 0 评论 -
hackerrank <Team Formation>
题意:共有n个整数,将他们分成若干组,满足组内均为连续的整数,且没有相同的整数。求所有分法中最少元素组的最大值。做法:贪心。将n个数从小到大排列得到a[1,2...n],如果存在一组以(a[i]-1)结尾,那么将a[i]插入到改组结尾,由于要让最少元素组最大,所以当存在多个以(a[i]-1)结尾的组时,应该插到元素数目最小的那个组中。由于有正有负,因此需要用map将结尾数与组中元素个数一一原创 2015-04-15 20:42:54 · 558 阅读 · 0 评论 -
STL常见用法(持续更新)
map作用:将两组数据类型一一对应起来,并且按第一关键字排序,支持删除、查找、插入操作原创 2015-04-17 10:12:35 · 419 阅读 · 1 评论 -
UVALive 6187 Never Wait for Weights(并查集)
题意:每次给出每两个数之间的大小差值。在给出关系的过程中插入询问:数a和数b的差值,若不能确定,输出UNKNOWN 解法:相对大小关系的处理:并查集 1.给出两点的相对大小关系后,找到两个点的根节点,并利用路径压缩,将两个点父亲指向根节点。然后将根节点进行合并,并给出根节点之间的相对大小关系 2.询问时,同时找到该点到根节点的距离,相减即可得到相对大小。原创 2015-05-14 00:49:39 · 405 阅读 · 0 评论 -
CodeForces 293E Close Vertices(点分治+Two Point法+树状数组)
关键词:点分治;Two Point法;树状数组 题意:给一棵含边权的树,求边条数不大于L,而且边权和不大于W的路径总数 解法:点分治;Two Point法;树状数组 点分治划归为以下问题:已知以重心为端点的所有<边条数,边长度>路径,求任意两条路径之和满足条件的对数。原创 2015-06-05 12:41:08 · 503 阅读 · 0 评论 -
字符串hash
HASH法相关函数原创 2015-07-12 11:41:01 · 269 阅读 · 0 评论 -
zoj2886 Nico Number
题意:求[l,r]区间内nico数的个数。支持[l,r]区间内同时对v取模和单点更新两种操作。nico数是所有的素数以及2的幂次和6(比nico数小且与nico数互素的数呈等差数列) 解法:由于a%b< a/2,因此对于每个数x最多取模logx次就变成0,因此区间取模可以对区间内的所有数字都取模,维护区间最大值和区间内nico数的和即可。原创 2015-07-31 13:33:00 · 253 阅读 · 0 评论 -
回文树
参考代码:http://blog.csdn.net/gatevin/article/details/44783041const int maxn =转载 2015-08-12 17:15:40 · 405 阅读 · 0 评论 -
Splay树
例题1:营业额统计 题意:寻找数列中每个数与前面数的最小差(绝对值) 解法:Splay树寻找前驱和后继 注意: 1.Splay树第一个元素需要手动插入 2.Splay树在插入每一个数后都需要进行伸展操作例题2:维修数列原创 2015-08-28 23:15:20 · 348 阅读 · 0 评论 -
主席树
主席树就是对原数列每个前缀[1…i]建立一棵线段树,线段树的每个节点存储某个前缀[1…i]中属于区间[L,R]的数字共有多少个。为了避免MLE,必须利用好相邻两个线段树之间的差别条件:相邻两个线段树最多只有log个节点信息不同。原因在于相邻两节点只增加了一个节点的值,所以只出现在线段树的某条路径中,最多log个节点原创 2015-10-05 20:39:44 · 588 阅读 · 0 评论 -
后缀数组
1.建立后缀数组2.求出height数组3.例题原创 2015-08-27 20:58:30 · 300 阅读 · 0 评论 -
Treap
bzoj3224 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最小的排名) 4. 查询排名为x的数 5. 求x的前驱(前驱定义为小于x,且最大的数) 6. 求x的后继(后继定义为大于x,且最小的数)#include<iostream>原创 2015-09-23 11:17:08 · 212 阅读 · 0 评论 -
bzoj1012 最大数maxnumber
操作1:在数组后添加某数;操作2:求数组最后L个数的最大值(L变动) 多次操作,每次询问求最大值关键词:求窗口区间最大值---单调队列、变形操作原创 2014-12-30 22:16:41 · 282 阅读 · 0 评论 -
poj3321
求树上以i节点为跟的子树的权值和,支持点更新操作关键词:tree_to_line、树状数组求区间和原创 2014-12-26 01:18:18 · 257 阅读 · 0 评论 -
poj1990&&uva1428 树状数组
求递增五元组的个数不断更新的动态规划?记c[i][j]为前k个数(当前状态)中以j结尾的递增i元组的个数若第k+1个数为a[k+1],则c[i][a[k+1]]+=sum(c[i-1][j]),2答案为sum(c[5][a[i]]),每次在更新第i个数之前进行叠加!区间和加法可以用树状数组优化!记c[i][j]为前k个数(当前状态)中树状数组意义下以j项节点区间所有点结尾的原创 2015-02-04 22:20:10 · 332 阅读 · 0 评论 -
uva11732 前缀树
求字符串集合中两两字符串公共前缀的2倍+1之和(当字符串全等时,求公共前缀的2倍)结论:字符串集合中任两个字符串的最长公共前缀是前缀树中根节点到最近公共祖先的字符串由上述结论,计数问题抽象为一个近似的数学模型:一个有根树每个节点u有权值val[u],求任意两点u和v的lca的深度depth*val[u]*val[v]之和采取等值合并计数方法。任意两点的lca是确定的,而相同lca的深度原创 2015-01-30 17:45:01 · 262 阅读 · 0 评论 -
uva11468 AC自动机&&树形DP
题意:给定一些字符和选择概率,随机选择L此得到长度为L的随机字符串。再给出K个模板串,计算S不包含任何一个模板串的概率。将所有可能字符加入Trie树,建立AC自动机,定义match数组。match[u]=1:u字符串含有模板子串。如何计算match数组?初始化:match[u]=1:u是模板串结尾结点递推公式:match[u]|=match[f[u]](u本身是模板串/u沿着失配边原创 2015-02-01 12:30:26 · 266 阅读 · 0 评论 -
UVA1449 AC自动机
给定n个由小写字母组成的字符串和一个文本串T,找出哪些字符串在T中出现的次数最多。AC自动机应用之一:统计每个模板串在原字符串中出现的次数AC自动机的精华:利用last函数,将模板串的所有子串连接起来,只要沿着边走就可以遍历所有模板串的所有子串对于重复的模板串题目要求重复输出,因此需要对每一个字符串对应一个序号,这样相同的字符串可以有两个不同的序号。#include#原创 2015-02-01 12:09:10 · 320 阅读 · 0 评论 -
uva 11019 AC自动机
二维字符串匹配把二维模板串的每行作为一个一维模板串,建立AC自动机,用原字符串的每行分别匹配,找到每一个匹配点(通过find函数即可做到),然后,在匹配的过程中,进行一些记录就可以求出结果!如何记录呢?记cnt[r][c]:以(r,c)为左上角的矩形与二维模板串P相同cnt[r-i][c]++:模板串的第i行字符串的匹配点在(r,c)处。 #include#inclu原创 2015-02-02 09:44:42 · 251 阅读 · 0 评论 -
poj3378 Crazy Thairs
求s序列连续定长子序列的个数(len=5)1.状态dp[i][j]:长度为i以第j个元素结尾的定长子序列个数2.状态转移方程:dp[i][j]=sum{dp[i-1][k],s[k]3.优化:求dp[i-1]数组前j-1项中比s[j]小的元素个数---树状数组。树状数组的应用之一:求A数组中前k-1项中比第k项小的元素的个数(数组中元素均正)具体做法:1.在数组中元素变换范围上原创 2014-12-25 13:06:55 · 389 阅读 · 0 评论 -
树状数组区间更新
#include#include#include#define maxn 101000#define mem(a,b) memset(a,b,sizeof(a))#define lowbit(x) x&(-x)#define sf scanf#define pf printfusing namespace std;int n,q,num;int c[maxn];void原创 2014-12-25 01:36:06 · 539 阅读 · 0 评论 -
vijos1512
一维和二维树状数组的使用c[i]:以i结尾的树状数组规律计数和c[i][j]表示以坐标(i,j)结尾的树状数组规律计数和原创 2014-12-25 01:08:21 · 331 阅读 · 0 评论 -
poj2481 Cows&&poj2352 Stars
n个区间,求每个区间被多少个区间覆盖做法:以右端点从大到小排序(主),左端点从小到大排序(次),ans[cow[i].id]=sum{(cow[j].a<=cow[i].a)?1:0,1<=j<=i-1},其中有一个特判需要注意处理!详见代码。n个点,求每个点左、下方点个数(包括左方和下方)做法:与上题类似 本题已经排好序,无需再排原创 2014-12-25 22:59:55 · 262 阅读 · 0 评论 -
poj3067 Japan
两列上升序列由若干线段相连,求两两交点的个数。按a大->小序列排序(主),b序列同上(次),求b序列的正序数对数即可。树状数组的应用之一:求A数组中前k-1项中比第k项小的元素的个数(数组中元素均正)拓展应用:求逆序数/正序数对数。在上面基础上求和即可原创 2014-12-26 01:59:11 · 300 阅读 · 0 评论 -
uva11107 后缀数组
给定n个字符串,求长度最大的字符串(不一定是原字符),在超过一半的字符串中连续出现1.将n个字符串通过特殊字符连接起来,合成一个文本串。题目转化为寻找匹配点的对应字符串个数超过n/2的最长字符串2.二分答案求出最大值。二分最大值的基础:如果对于x成立,则对于不大于x的所有值都成立,则可以二分最大值3.判断是否存在长度不小于p的串在超过n/2的不同字符串区域出现如何判断?原创 2015-02-02 19:54:09 · 282 阅读 · 0 评论 -
uva 11995 ADT
判断数据结构种类,模拟注意嵌套书写方式#include#include#includeusing namespace std;const int maxn = 1000 + 10;int n, t[maxn], v[maxn];int check_stack() { stack s; for(int i = 0; i < n; i++) { if(t[i]原创 2015-02-03 11:28:22 · 238 阅读 · 0 评论 -
uva11991 ADT
查找数组中第k个v出现的位置,不存在输出0用map > a;可以开二维不定长数组!#include#include#includeusing namespace std;map > a;int main(){ int n,m,x,y; //freopen("a.txt","r",stdin); while(scanf("%d%d",&n,&m)!=原创 2015-02-03 11:31:54 · 262 阅读 · 0 评论 -
poj1990 MooFest
x轴上有n个坐标点,每个点x[i]有一个权值v[i],距离定义为:dis[i][j]=max{v[i],v[j]}*abs(x[i]-x[j]),求n个点所有距离之和。做法:按v[i]从小到大排序,dp[i]定义为以1-i点之间以i结尾的点对距离之和。dp[i]=v[i]*sum{ abs(x[i]-x[j]),1<=j<=i-1 }。对于x[i]的系数,只要知道x数组1 - i-1位中比x[i]小的个数,记为c[i],x[j]的正负只要知道x数组1 - i-1位中比x[i]]小的数之和,记为t[i],则原创 2014-12-26 19:56:50 · 287 阅读 · 0 评论 -
uva1203 ADT
结构体+优先队列解决多路合并问题:将k个有序表合并成一个有序表。设共有n个元素,每个元素插入和取出一次,因此总复杂度O(n*logk)。#include#include#includeusing namespace std;struct Item{ int Qnum,Period,Time; bool operator<(const Item& a) cons原创 2015-02-03 11:46:45 · 329 阅读 · 0 评论 -
poj3321 树状数组
每个节点有权值为0/1,初始化为1,每次操作都使得某点权值变化,每次询问某点及其子树权值和。树的子树权值和问题可转化为线性数组问题:记st[u]为dfs第一次访问u的时间戳,en[u]为dfs回溯到u的时间戳。从而子树权值和问题转化为连续区间求和和点更新问题,可以用树状数组进行解决。变题:每个点权值初始化为任意值;点更新时可以更新为任意值,求子树权值和。思路类似,updat原创 2015-02-04 21:39:52 · 332 阅读 · 0 评论 -
uva3027 ADT
若干个有根树,每个节点和父节点的距离=编号之差的绝对值%1000。每次询问一个节点和根节点间的距离。询问过程中可以采取路径压缩并维护数组d[i]:i到其父节点的距离。可以大大降低复杂度#include#include#include#includeusing namespace std;;const int maxn=20000+10;int pa[maxn],d[m原创 2015-02-04 21:13:07 · 275 阅读 · 0 评论 -
uva1160 ADT
每次给出一个由两种元素组成的化合物,如果加入该化合物后,存在k个化合物恰包含k中元素,则存在安全隐患,故不能将其加入,否则加入。判断有多少个化合物不能被加入。抽象出数学模型:每次加入一个化合物,相当于两种元素相关。因此每个元素为一个节点,每个化合物是一条边。题目转化为:始终不存在环关系,有多少个化合物不能被加入?结论:加入该边后存在环该边两端点的根节点相同将顶点按根节点进行分类--原创 2015-02-04 19:44:55 · 296 阅读 · 0 评论 -
树套树
1.bzoj1146 树上支持两种操作: 1.更改点权 2.求某链上第k大的值,如果不存在第k大的值,输出一串字符原创 2015-09-23 16:15:00 · 326 阅读 · 0 评论