数据结构
文章平均质量分 87
画船听雨
和梦想谈一次恋爱,也要疯狂,也要坚持
展开
-
sdut oj 2128排序二叉树的中序遍历
这题建树是关键,注意建树的时候可以用循环。。。不一定非得用递归。。。还有就是得注意细节,因为没有初始化t,wa了一次。这是因为要每次从头遍历。。。找到位置。。。题目描述在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的原创 2013-06-29 12:20:11 · 2271 阅读 · 0 评论 -
学习笔记——线段树算法学习
这是从网上看到的两篇博客感觉挺好的就转过来,留作复习的材料。转载来源:http://www.cnblogs.com/superbin/archive/2010/08/02/1790467.html线段树(interval tree) 是把区间逐次二分得到的一树状结构,它反映了包括归并排序在内的很多分治算法的问题求解方式。 上图是一棵典型的线段树,它对区间[1转载 2014-02-19 19:54:24 · 1414 阅读 · 0 评论 -
HDU 1556 Color the ball 线段树入门题
典型的线段树,区间的更新,统计区间内元素的和。Color the ballTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7031 Accepted Submission(s): 3668Probl原创 2014-02-20 10:28:39 · 888 阅读 · 0 评论 -
HDU 1166 敌兵布阵 线段树入门题目
跟HDU1754 差不多,就是线段树的动态修改,与查询。敌兵布阵Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 34753 Accepted Submission(s): 14770Problem原创 2014-02-20 17:09:56 · 939 阅读 · 0 评论 -
POJ 3928 Ping pong(树状数组)
大白书P197有详细的解释,注意每个点找过之后要更新,原创 2014-06-27 19:52:44 · 782 阅读 · 0 评论 -
HDU 1754 I Hate It 线段树入门
线段树的建立与动态的更新和查询。在这里说一下啊,由于输入写的不对,一直RE,以后得注意一下,ctrl+Z一定得直接退出啊。I Hate ItTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 31303 Accep原创 2014-02-20 14:22:57 · 809 阅读 · 0 评论 -
HDU 4893 Wow! Such Sequence!(线段树)
很典型的线段树,注意就是一个数字如果变成了斐波那契数字之后如果在change的话,它是不会反生改变的,因为最近的斐波那契数字就是它本身了啊。用一个flag表示这一段上的数字是否change过,如果flag == 1已经change过,就不会在向下更新。否则的话就进行更新,最后会到达一个节点,更新这个节点。这里用暴力更新就行,找到最近的斐波那契数字。Add就是一个点更新,sum求和就是一个区原创 2014-07-30 08:31:08 · 960 阅读 · 0 评论 -
POJ 2774 Long Long Message && URAL 1517. Freedom of Choice(求最长重复子序列)
两个题目意思差不多,都是让求最长公共子串,只不过poj那个让输出长度,而URAL那个让输出一个任意的最长的子串。解体思路:Long Long MessageTime Limit: 4000MS Memory Limit: 131072KTotal Submissions: 22313 Accep原创 2015-01-26 21:31:44 · 1404 阅读 · 0 评论 -
POJ 3415 Common Substrings(后缀数组求重复字串)
题目大意:给你两个字符串,让你求出来两个字符串之间的重复子串长度大于k的有多少个。解题思路:先说论文上给的解释:基本思路是计算A的所有后缀和B的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k的部分全部加起来。先将两个字符串连起来,中间用一个没有出现过的字符隔开。按height值分组后,接下来的工作便是快速的统计每组中后缀之间的最长公共前缀之和。扫描一遍,每遇到一个B的后缀就统原创 2015-01-27 10:57:29 · 1068 阅读 · 0 评论 -
POJ 3294 Life Forms(后缀数组求k个串的最长子串)
题目大意:给出n个字符串,让你求出最长的子串,如果有多个按照字典序顺序输出。解题思路:将n个字符串连起来,中间需要隔开,然后我们二分枚举字符串的长度,求最长的长度,如果多个需要按照字典序保存起来,最后输出答案就可以了。时间复杂度是:O(n*log(n))。Life FormsTime Limit: 5000MS Memory Limit: 65536K原创 2015-01-27 15:38:42 · 1169 阅读 · 0 评论 -
SPOJ 687. Repeats(后缀数组求最长重复子串)
题目大意:给你一个串让你求出重复次数最多的连续重复子串的重复次数。解题思路:论文上给出的解答是:这还没完,因为经过这两个点的情况还不完备,应还可以假设起点在 [ i*j-i+1, i*j-d],其中 d = i-L/i (d = i-L%i)其意义为根据已知的匹配长度,可以将起点往前移动的范围,太靠后将不能够构造出比之前更好的解。如果要求出某个最多的连续重复子串的最小字典序子需要枚原创 2015-01-26 15:59:20 · 1541 阅读 · 0 评论 -
SPOJ 220. Relevant Phrases of Annihilation(后缀数组多次不重叠子串)
题目大意:给定N个串,求每个串至少出现两次的最长子串。解题思路:每个字符串至少出现两次且不可重叠的最长子串:二分枚举长度后在同一分组中对每一个字符串保留一个最小的位置和一个最大的位置,最后查看是否每个串在同一组中都有至少两个后缀,并且后缀的坐标差大于枚举的长度。POJ Problem Set (classical)220. Relevant Phrases of Annihil原创 2015-01-27 16:59:28 · 1148 阅读 · 0 评论 -
POJ 3693 Maximum repetition substring(后缀数组求最长重复子串)
题目大意:和spoj687类似,就是当长度相同是需要输出一个最小的字典序的序列。解体思路:这次需要枚举所有的从i到d = i-L/i (d = i-L%i)的位置,然后记录保证最大值的同时,求出来字典序最小的。Maximum repetition substringTime Limit: 1000MS Memory Limit: 65536K原创 2015-01-26 16:47:24 · 1250 阅读 · 0 评论 -
POJ 3580 SuperMemo(伸展树的基本操作)
题目大意:给你六个操作,让你实现这些功能。解题思路:伸展树的基本应用,用伸展数实现各种功能。SuperMemoTime Limit: 5000MS Memory Limit: 65536KTotal Submissions: 10404 Accepted: 3320Case Time Limit: 2000MS原创 2015-02-07 09:44:04 · 1427 阅读 · 0 评论 -
学习笔记----伸展树
http://dongxicheng.org/structure/splay-tree/转载 2015-02-07 09:22:44 · 1089 阅读 · 0 评论 -
POJ 1743 Musical Theme(后缀数组)
题目大意:给出n个数字。首先将这n个数前后做差,得到另一个长度是n-1的序列。求出这个序列的最长重复子串,且这些子串不能重叠。PS:这题论文上有解析。解题思路:先二分答案,把题目变成判断性问题:判断是否存在两个长度为k的字串是否相同的,且不重叠。解决这个问题的关键还是利用height数组。把排序后的后缀数组分成若干组,其中每组的后缀之间的height值都不小于k。容易看出,有希望成原创 2015-01-22 16:54:50 · 979 阅读 · 0 评论 -
SPOJ 694. Distinct Substrings,705. New Distinct Substrings(后缀数组)
题目大意:给定长度为N的字符串,求出其中不相同子串的个数。解题思路:每一个字串一定是某个后缀的前缀,那么原问题就可以等价于求所有后缀之间的不相同的前缀的个数。如果所有的后缀按照suffix(sa[1]),suffix(sa[2])……suffix(sa[n])的顺序计算,我们会发现对于每个新加进来的后缀suffix(sa[k]),它将产生n-sa[k]+1个新的前缀。但是其中有leight[k原创 2015-01-22 19:29:52 · 1065 阅读 · 0 评论 -
HDU 4622 Reincarnation( 任意区间子串的长度, 后缀数组+RMQ)
题目大意:给你一个字符串,给你N次查询,每次给你一个区间让你求出这个区间里面有多少子串。解题思路:我们肯定要枚举位置,然后找公共子串然后再去掉重复的,但是他的地址对应的rank不是连续的,如果暴力找的话会n*n会超时。从这个博客学习到一种方法:首先对整个字符串求一次sa[]以及height[],之后对于任意区间[L, R],遍历一遍sa[],只要起点在[L, R]内的后缀就需要进行统计,类原创 2015-01-23 19:00:25 · 1280 阅读 · 0 评论 -
POJ 3264 Balanced Lineup 线段树入门(点的查找)
这道题的意思是:给你n个点,每个数出现的位置对应着改点数的大小。然后给出m个区间输出每个区间上的最大值与最小值的差。典型的线段树啊,自己写的那个代码很搓,然后啸爷教了我,他怎么写的,就学习了一下。以后尽量写的好一点啊。主要是线段树的建立与查找。Balanced LineupTime Limit: 5000MS Memory Limit: 65536K原创 2014-02-20 08:49:17 · 927 阅读 · 0 评论 -
POJ 2777 Count Color 线段树入门题
今天开始看的线段树,感觉树存储的优势了啊,很强大、时间复杂度降低了很多啊。在这里先说一下题目的大体意思是:给区间进行染色,后染的颜色会会覆盖掉之前染过的颜色,然后输入C是代表给区间(a,b)染色成c。P代表输出区间(a,b)一共有几种颜色。典型的线段树的创建、修改、与查询问题啊。所以要用线段树来做啊、否则会超时的啊,我好像跑了969ms,有点龟速了啊,但是重点是学习算法,优化以后熟悉了再说原创 2014-02-19 20:06:16 · 929 阅读 · 0 评论 -
数据结构上机测试4.1:二叉树的遍历与应用
这个问题的大体解题思路是通过对先序排序的第一个数是每一层二叉树的根的特点,结合中序排列的特点,将先序排序中第一个把中序中的字符串分成两部分,左边是左叉树,右边是右叉树,然后递归调用它自己,一直到先序排序中每个子区间的长度为零为止,再结合先序排序中的第一个是后序排序中最后一个的特点将递归调用得到的先序排序中每个区间的第一个数放在后序排序字符串中的最后一个,在输出结果就行了。下面是参考刘汝佳《算法转载 2013-02-19 17:01:07 · 3273 阅读 · 0 评论 -
数据结构实验之二叉树的建立与遍历
这道题它把空格的情况用‘ ,’来进行表示所以相对比较简单了……对这题进行分析,先根据先序的顺序建立二叉树,再通过调用几个功能不同的函数进行不同效果的操作。#include #include #include int sum=0; typedef struct node //通过typedef自定义类型可以简化书写;{ char data; struc原创 2013-02-19 19:03:57 · 3094 阅读 · 0 评论 -
数据结构实验之栈二:一般算术表达式转换成后缀式
连接http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2132&cid=1135这题是一个典型的栈的题,因为优先级别的不同导致了后缀式的顺序的不同。 这道题的关键是就是运算级的处理,先将第一个数字压入栈底,之后进行查找遇到数字就将数字进栈,遇到运算符就将栈中的数字进行出栈,再将运算符进行入栈处理;如果遇到括号,先将左括号之前的数字或者运算原创 2013-03-12 19:53:35 · 3843 阅读 · 2 评论 -
数据结构实验之求二叉树后序遍历和层次遍历
先根据先序遍历和终须遍历的关系建立起树杈模型,之后 这题的关键是层次遍历,根据队列的原理一层一层的从左向右出来,上一层的决定下一层的;二叉树比较方便的是只要左右,所以最多两次,还有就是有可能树杈为空所以注意为空的判断条件。#include #include #include typedef struct node{ char data; struct node *lc,*r原创 2013-02-20 09:50:07 · 3033 阅读 · 0 评论 -
POJ 2828 Buy Tickets 线段树入门(建树稍微有点抽象)
一开始看的时候真的不知道为什么是线段树的题目。后来看到了网上他们的讲解,发现原来也是线段树。先说一下题意:就是买票插队的问题,有n个人插队,他们都是插道a的后面,所以他的当前位置是a+1,然后也肯能会有别的人插到他的前面去,所以他的最终位置会发生变化,要你说出最终队伍的顺序。做的方法是:倒过来更新线段树,找到每个人应该存在的位置,然后记录下来,输出就行了。解释一下算法:这里建树保存原创 2014-02-20 21:17:36 · 1001 阅读 · 0 评论 -
POJ 2582 Mayor's posters 线段树入门题+离散化
本来线段树就学的不扎实,后来个什么离散化,乱乱的啊、、后来看了一人写的,用结构体记录的方法进行离散化。感觉写的挺好的。题意很简单:就是在一堵墙上涂色,然后输出你能看到的颜色的种类。离散化+涂色问题。Mayor's postersTime Limit: 1000MS Memory Limit: 65536KTotal Submissions:原创 2014-02-20 16:55:20 · 1060 阅读 · 0 评论 -
POJ 2886 Who Gets the Most Candies?(线段树+反素数)
这个反素数不太会,这道题目其实也不是自己想出来的看了别人的博客:http://blog.csdn.net/weiguang_123/article/details/7880875里面说的很详细,我就不在多说了啊。Who Gets the Most Candies?Time Limit: 5000MS Memory Limit: 131072K原创 2014-02-22 15:26:36 · 851 阅读 · 0 评论 -
学习笔记----各种排序(先从宝哥这里转来,以后自己多写写)
各种排序。。。最近想写一写排序。。所以就写了一下可是发现自己基础的知识都不会了,,哎,弱爆了。。。。二叉树排序的链表实现与数组实现#include #include struct node{ int key; node *lc,*rc;}*rt,*p;void insert(node *rt,int原创 2013-12-17 17:04:58 · 1130 阅读 · 3 评论 -
POJ 2352 Stars(简单树状数组)
什么是树状数组在这里就不说了啊,这里有解释了啊。http://blog.csdn.net/fulongxu/article/details/19701281就是一个模版题目,直接套模版都可以过。先建数组,再求和。StarsTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 293原创 2014-02-22 21:16:01 · 970 阅读 · 0 评论 -
POJ 2750 Potted Flower(线段树+dp)
题目大意:给定一个环形序列,每次修改一个元素,输出环上的最大连续子列的和。解题思路:用线段树记录当前区间的非空最大子列和当前区间的非空最小子列。如果环上的数都是正整数,答案是:环上数的总和-根结点的非空最小子列;这里面要注意的是:建树的时候要一遍输入一遍递归。Potted FlowerTime Limit: 2000MS Memory Limit:原创 2014-02-22 19:07:57 · 1032 阅读 · 0 评论 -
学习笔记----树状数组
感觉写的很好,转过来学习一下:http://www.cppblog.com/Ylemzy/articles/98322.html树状数组树状数组是对一个数组改变某个元素和求和比较实用的数据结构。两中操作都是O(logn)。 在解题过程中,我们有时需要维护一个数组的前缀和S[i]=A[1]+A[2]+...+A[i]。 但是不难发现,如果我们修改了任意转载 2014-02-22 20:54:11 · 1019 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers(线段树区间操作)
题目的意思很简单就是一个线段树的区间的增加数字,与区间的查询。说一下,区间操作的题目第一次做啊,我瞎搞了一下,超时了啊。于是求助于啸爷,啸爷又是“苦心教导”啊。。感激不近啊。。一个区间当有更新的时候,先把区间上的总和更新一下,然后标记一下更新的多少,然后如果以后还会找到这个区间的时候,要把他所标记的那个数字传到他的左右子树中去。因为,这样的话,只更新了这个区间。他的子区间能没有发生过改变。原创 2014-02-25 20:33:06 · 889 阅读 · 0 评论 -
POJ 3321 Apple Tree(dfs+树状数组)
题目的意思是给你一棵树上面有很多苹果,你可以摘苹果树也会长苹果。让你求出树上某一节点上所有的苹果。从别人那里看的分析,感觉挺好的:分析:每个分支其实就是一个节点,先dfs整个树,求出每个节点的时间戳,即每个节点第一次访问的时间和最后一次访问的时间,分别用begin和end记录,以时间戳为编号,则在begin[x]和end[x]之间的编号的节点就是x的子树,以时间戳为树状数组的下标,查询时,原创 2014-02-26 18:37:50 · 1153 阅读 · 0 评论 -
学习笔记----RMQ算法
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。2.RMQ算法对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大转载 2014-02-26 20:42:48 · 731 阅读 · 0 评论 -
POJ 3264 Balanced Lineup(简单的RMQ)
话说刚开始学习线段树的时候就拿这题试了一下水,给过了。现在学习RMQ再过一遍,感觉这种方式即好写又快啊,不错啊。算法就不解释了啊。大家可以看一下刘汝佳写的大白书。感觉写的挺好的。RMQ第一题。#include #include #include #include #include #include #include #include #include #include #i原创 2014-02-26 20:46:25 · 878 阅读 · 0 评论 -
POJ 1195 Mobile phones(二维树状数组)
题意很清晰就是对一个矩阵进行区间的更新与查询,代码写起来很简单。就是树状数组存贮方式的原理得知道,感觉树状数组,很强大啊、芳姐给指点的思路,每一个数组元素的子树是这个下标二进制的从右向左第一个1表示之前有多少个00。比如8->1000所以它可以由0100(4),0110(6),0111(7),组成。详解看之前的博客:http://blog.csdn.net/fulongxu/article/det原创 2014-02-26 15:22:35 · 897 阅读 · 0 评论 -
POJ 3368 Frequent values (UVA 11235)(RMQ)
感觉不太好做吧,算法训练指南P198 UVA11235和这道题的解释一样。大家可以参考一下。Frequent valuesTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 12436 Accepted: 4554DescriptionYou原创 2014-02-27 19:37:01 · 853 阅读 · 0 评论 -
URAL 1297. Palindrome(后缀数组求最大回文串)
题目大意:给你一串字符串,让你求出来它存在的最长连续的回文串。解题思路:先把字符串逆序加到数组中,然后用后缀数组求解。两种方法:1,枚举排名,直接比较rank相同的字符串的位置差是不是len。如果是的话,就记录求解;2,枚举地址,求第i地址与第2*len-i+1的lcp的最大值。PS:需要注意如果多解输出靠前的字符串。两种写法写在了一起,分别是Del,和Del1函数。1原创 2015-01-23 21:24:09 · 1138 阅读 · 0 评论