数据结构
heben99
这个作者很懒,什么都没留下…
展开
-
后缀数组
#include #include #include using namespace std;#define Min(a,b) (a)const int N = 2000;const int D = 10;const int M = 260;int n;char s[N] = "abcabdeabf";int cnt[N], mem[4原创 2008-08-04 11:35:00 · 747 阅读 · 2 评论 -
poj 1743 后缀数组
思路:要求A中两子串之差为定值,将每相邻两个数相减所得数列B,等价于要求B中子串相等。从而转换LCP(longest commen prefix)问题,又要求不能重叠,采用二分答案方法求解。要注意的是二分期间的判断search_ans:若果h[i]>=len,并且h[j]>=len,则sa[i]..s[j]中的最大与最小值之差即为重叠瓶颈! #include #incl原创 2008-08-04 15:13:00 · 1289 阅读 · 0 评论 -
POJ 2758 后缀数组
思路:1.如果没有操作I,也就是insert操作,则很容易想到用后缀数组处理,直接计算lcp(i,j)即可,要注意的是用rmq计算lcp[i][j]的时候,如果i==j,要做特殊处理!2.题目有个很容易误解的地方,就是Q操作的时候是对原始下标,而I操作的p是插入后的下标3.计算Q(i,j)的时候,首先计算lcp(i,j), 1)如果lcp(i,j)大于离i,j最近的插入字符原创 2008-08-04 19:15:00 · 1817 阅读 · 0 评论 -
POJ 2774 后缀数组
题目要求:求s1,s2的最大子串思路:将s1,s2合并为一个字符串s, 也就是求s的max(lcp[i][j]), 唯一i,j分别位于s1和s2, 利用后缀数组计算s的h[]或者height[]数组,那么答案即为h中的最大值。证明如下:s1,s2一定存在最大子串t,t为s1的子串t1和s2的子串t2的lcp[t1][t2], 假设t1,t2在后缀数组中不相邻,则任意取后缀数组中位于t1,t原创 2008-08-04 20:41:00 · 1806 阅读 · 0 评论 -
hust 1007 平衡树
思路:该题目要求在log(n)时间内进行插入,删除,求后继操作,可以使用平衡树解决,由于不用求名次或者取k大,所以可以和使用stl set来解决,可以存在相同的数,所以要用multiset. 代码如下#include #include #include using namespace std;int main(){ int i,j,k,原创 2008-08-06 10:55:00 · 426 阅读 · 0 评论 -
NOI2004 郁闷的出纳员caisher SBT
郁闷的出纳员 【问题描述】OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。工资的频繁调整很原创 2008-08-05 22:04:00 · 1779 阅读 · 0 评论 -
hust 1007 treap
#include #include using namespace std;struct treap{ int key, pri, cnt; treap *lc, *rc; treap(int x, int y);}NIL=treap(0,0), *nil=&NIL;treap::treap(int x=0, int y=0原创 2008-08-06 13:53:00 · 387 阅读 · 0 评论