摘要:
1 //线段树的节点 2 //节点包括两部分信息,基本域,和信息域 3 //基本域:左右边界ld,rd. 左右孩子:lc,rc 4 //信息域:key值,如RMQ问题中,信息域中存储的是区间最大值 5 struct Node{ 6 int ld,rd; 7 Node *lc,*rc; 8 int key; 9 };10 11 //空树的建立,内含key值的初始化;12 //一般在主函数中首先调用 Node* root= buildtree(1,n);建立一棵新树13 Node *buildtree(int a,int b){14 Node * p=new ... 阅读全文
摘要:
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。2.RMQ算法对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大且查询很频繁时,该算法无法在有效的时间内查询出正解。本节介绍了一种比较高效的在线算法(ST算法 阅读全文
摘要:
1 #include<stdio.h> 2 #include<string.h> 3 4 char a[1000010]; 5 char b[10010]; 6 int next[10010]; 7 int A,B; 8 void getnext() 9 {10 int i=0,j=-1;11 next[0]=-1;12 while(i<B)13 {14 if(j==-1||b[i]==b[j]) next[++i]=++j;15 else j=next[j];16 }17 }18 19 int kmp_i()... 阅读全文