【COGS2622】后缀平衡树】的更多相关文章

这是个后缀平衡树的裸题.... 然后傻逼的我调了一下午. #include<bits/stdc++.h> typedef long long ll; using namespace std; ; ; int hs[N],M[N]; int n,len,ans,Ans[N]; inline int read(){ ,x=;char ch; ;}'); +ch-'); return f*x; } struct Suffix_Balanced_ScapeGoat_Tree{ int lx[N],rx…
题目描述 有一棵树,每条边上面都有一个字母.每个点还有一个特征值\(a_i\). 定义一个节点\(i\)对应的字符串为从这个点到根的路径上所有边按顺序拼接而成的字符串\(s_i\). 有\(m\)次操作: \(0~u~l~r\):询问有多少个字符串\(s_i\)满足\(lcp(s_i,s_u)\geq l\)且\(a_i\leq r\) \(1~f~a~c\):新增一个点,父亲为\(f\),到父亲的边上的字符为\(c\). 强制在线. \(n,m\leq 40000\) 题解 因为要加新的点而且…
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; int sa[N],rk[N],hei[N],x[N],y[N],c[N]; char s[N]; void Rsort(R n,R m){ for(R i=1;i<=n;++i)++c[x[i]]; for(R i=2;i<=m;++i)c[i]+=c[i-1]; for(R i=n;i;--…
国际惯例的题面: 考虑如果没有强制在线我们能怎么水掉这个题,先构造出字符串,各种方法求一下后缀数组,然后线段树维护区间rank最小的位置即可.然而他要求强制在线,支持插入后缀,并比较后缀大小(求rank)的数据结构,当然就是后缀平衡树啦.于是插入字符串的操作,我们只需要在后缀平衡树上插入这个后缀.此时不需要对线段树进行修改,因为线段树中任何一个位置均不包含新插入的这个后缀(保证信息合法).什么你说插入会改变每个后缀的rank值?没关系我们不需要知道每个后缀的rank具体是多少,我们只需要它们的相…
后缀平衡树的裸题 后缀平衡树简单的思想如下 具体的可以去看$clj$的论文 假设我们已经有了串$S$的后缀平衡树 插入一个字母$c$ 我们用$Si$代表原串$S$从第$i$个字符开始的后缀 则后缀$cS$与任意一个后缀$Si$的大小关系可以用 $c$与$Si$的第一个字母的大小关系 以及 后缀$S1$与后缀$Si+1$的大小关系来表示 前面是两个字符的比较$O(1)$ 后面两个原串后缀的大小关系由后缀平衡树所代表其的节点标号快速得出两个后缀大小 $O(1)$ 于是我们只要维护一个平衡树来$O(1…
这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为了进一步证明你确实有给后缀排序的超能力,请另外输出 n−1 个整数分别表示排序后相邻后缀的最长公共前缀的长度. 输入格式 一行一个长度为 n 的仅包含小写英文字母的字符串. 输出格式 第一行 n 个整数,第 i 个整数表示排名为 i 的后缀的第一个字符在原串中的位置. 第二行 n−1 个整数,第 i…
没错,一定是无聊到一定境界的人才能干出这种事情. 这个无聊的zcysky已经不满足于用后缀平衡树求sa了,他想用sam试试. 我们回顾下sam的插入过程,如果我们从最后一个state沿着suffix link向上爬parent tree 那么我们就可以遍历这个sam的所有后缀. 那么我们把插入的时候经历的state全都标记下来,并且记录下这个state对应的序号 在对parent tree进行dfs的时候先序遍历一下就可以了. #include<bits/stdc++.h> #define N…
题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当前节点是$[l,r]$,则左儿子是$[l,mid]$,右儿子是$[mid,r]$ 令$f[x]=(l[x]+r[x])*0.5$,则$f$比较大小则等价于序列中的元素比较大小 此时,用重量平衡树来实现这一过程,可以做到均摊$O(\log n)$修改,$O(1)$查询两个点之间的大小关系 本题中,考虑使用一棵平…
高级数据结构 一.左偏树&斜堆 orz黄源河论文 合并,插入,删除根节点 打标记 struct Node { int fa,l,r,w,dep } tree[Mx]; int Merge(int k1,int k2)//返回值为根节点 { ||k2==) return k1+k2; if(tree[k1].val<tree[k2].val) swap(k1,k2); tree[k1].r=Merge(tree[k1].r,k2); tree[tree[k1].r].fa=k1; if(tre…
后缀平衡树的模板题? I'm so weak…… 现在觉得替罪羊树比 treap 好写,是不是没救了喵- #include <cstdio> #include <cmath> typedef unsigned long long LL; const double a=0.55; ; ; ; inline int getint(); inline char getch(); inline int getstr(char * ); inline void putint(int); in…