BZOJ3682 Phorni 后缀平衡树】的更多相关文章

后缀平衡树的裸题 后缀平衡树简单的思想如下 具体的可以去看$clj$的论文 假设我们已经有了串$S$的后缀平衡树 插入一个字母$c$ 我们用$Si$代表原串$S$从第$i$个字符开始的后缀 则后缀$cS$与任意一个后缀$Si$的大小关系可以用 $c$与$Si$的第一个字母的大小关系 以及 后缀$S1$与后缀$Si+1$的大小关系来表示 前面是两个字符的比较$O(1)$ 后面两个原串后缀的大小关系由后缀平衡树所代表其的节点标号快速得出两个后缀大小 $O(1)$ 于是我们只要维护一个平衡树来$O(1…
国际惯例的题面: 考虑如果没有强制在线我们能怎么水掉这个题,先构造出字符串,各种方法求一下后缀数组,然后线段树维护区间rank最小的位置即可.然而他要求强制在线,支持插入后缀,并比较后缀大小(求rank)的数据结构,当然就是后缀平衡树啦.于是插入字符串的操作,我们只需要在后缀平衡树上插入这个后缀.此时不需要对线段树进行修改,因为线段树中任何一个位置均不包含新插入的这个后缀(保证信息合法).什么你说插入会改变每个后缀的rank值?没关系我们不需要知道每个后缀的rank具体是多少,我们只需要它们的相…
模板 后缀数组 #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;--…
后缀平衡树+线段树. $O(1)$比较大小的标号法真是强大. #include<cstdio> #include<cmath> #define N 300010 #define M 500010 using namespace std; typedef unsigned long long ll; const ll inf=1ULL<<63; const double A=0.8; ll tl[N],tr[N],tm[N]; int size[N],son[N][2],…
题目描述 有一棵树,每条边上面都有一个字母.每个点还有一个特征值\(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> 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…
后缀平衡树裸题. 后缀平衡树呢,实际上是一个很naive的东西.就是用平衡树维护后缀数组. 这样的话就可以支持在最前端插入一个字符(相当于插入新的后缀) 每次比较节点的tag是O(1)的,所以可以快速的支持插入和查询. 为了保证重构的复杂度,后缀平衡树必须使用重量平衡树. 如替罪羊树,Treap,Weight-Balanced-Finger-Tree等. #include<bits/stdc++.h> #define N 1000005 #define lson (o<<1) #d…
题目链接 题目描述 Phorni 是一个音之妖精,喜欢在你的打字机上跳舞. 一天,阳光映射到刚刚淋浴过小雨的城市上时,Phorni 用魔法分裂出了许多个幻影,从 1 到 n 编号. 她的每一个幻影都站在打出的字符串的一个位置上,多个幻影可以站在同一个位置上. 每一个幻影代表的字符串即为从它站立位置开始的后缀,注意站立位置是从右往左数的. 让我们形式化地描述一下,若第 i 个幻影站在 Pi 上,那么它所代表的字符串就是 S[L-Pi+1-L],其中 L 是字符串 S 的长度. 每一次,她会选一段编…
后缀平衡树的模板题? 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…
这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为了进一步证明你确实有给后缀排序的超能力,请另外输出 n−1 个整数分别表示排序后相邻后缀的最长公共前缀的长度. 输入格式 一行一个长度为 n 的仅包含小写英文字母的字符串. 输出格式 第一行 n 个整数,第 i 个整数表示排名为 i 的后缀的第一个字符在原串中的位置. 第二行 n−1 个整数,第 i…