这是个后缀平衡树的裸题。。。。

然后傻逼的我调了一下午。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=1e5+;
const int bas=;
int hs[N],M[N];
int n,len,ans,Ans[N];
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
struct Suffix_Balanced_ScapeGoat_Tree{
int lx[N],rx[N],rt,size[N],s[N],cnt,Q[N],tail;
ll tag[N];
int get(int i,int l){return hs[i]-hs[i-l]*M[l];}
int qlcp(int x,int y){
int l=,r=min(x,y);
while(l<r){
int mid=(l+r)>>;
if(get(x,mid+)==get(y,mid+))l=mid+;else r=mid;
}
return l;
}
inline bool cmp(int x,int y){int l=qlcp(x,y);return s[x-l]<s[y-l];}
inline int merge(int x,int y){
if(!x||!y)return x|y;
if(size[x]>size[y]){size[x]+=size[y];rx[x]=merge(rx[x],y);return x;}
else{size[y]+=size[x];lx[y]=merge(x,lx[y]);return y;}
}
inline int build(int ls,int rs,ll l,ll r){
if(ls>rs)return ;
int mid=(ls+rs)>>;ll midv=(l+r)>>;int x=Q[mid];tag[x]=midv;
lx[x]=build(ls,mid-,l,midv);rx[x]=build(mid+,rs,midv,r);
size[x]=rs-ls+;return x;
}
inline void dfs(int x){if(lx[x])dfs(lx[x]);Q[++tail]=x;if(rx[x])dfs(rx[x]);}
inline int rebuild(int x,ll l,ll r){
tail=;dfs(x);return build(,tail,l,r);
}
inline int ins(int x,ll l,ll r,int val){
if(!x){
size[++cnt]=;lx[cnt]=rx[cnt]=;tag[cnt]=(l+r)>>;
return cnt;
}
size[x]++;
if(cmp(x,val)){
rx[x]=ins(rx[x],tag[x],r,val);
if(size[rx[x]]>0.65*size[x])x=rebuild(x,l,r);
}
else{
lx[x]=ins(lx[x],l,tag[x],val);
if(size[lx[x]]>0.65*size[x])x=rebuild(x,l,r);
}
return x;
}
inline int del(int x,int val){
if(x==val)return merge(lx[x],rx[x]);
size[x]--;
if(tag[x]<tag[val])rx[x]=del(rx[x],val);
else lx[x]=del(lx[x],val);
return x;
}
inline int queryrk(int key){
int x=rt,ans=;
while(){
int i=size[lx[x]]+;
if(key==x)return ans+i;
if(tag[x]<tag[key])x=rx[x],ans+=i;else x=lx[x];
}
}
inline int find(int key){
int x=rt;
while(){
int i=size[lx[x]]+;
if(key==i)return x;
if(key>i)x=rx[x],key-=i;else x=lx[x];
}
}
inline void del(int x){
int rk=queryrk(x),y=find(rk-),z=find(rk+);
ans-=qlcp(x,y)+qlcp(x,z)-qlcp(y,z);
rt=del(rt,x);cnt--;len--;
}
inline void ins(int x){
s[++len]=x;hs[len]=hs[len-]*bas+x;
rt=ins(rt,,1LL<<,len);
if(len<)return;
int rk=queryrk(len),y=find(rk-),z=find(rk+);
ans+=qlcp(len,y)+qlcp(len,z)-qlcp(y,z);
}
}T;
char str[N];
struct Edge{int u,v,next;}G[N<<];int head[N],tot=;
inline void addedge(int u,int v){
G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
G[++tot].u=v;G[tot].v=u;G[tot].next=head[v];head[v]=tot;
}
inline void dfs(int u,int fa){
T.ins(str[u]-'a'+);Ans[u]=(len-)*(len-)/-ans;
for(int i=head[u];i;i=G[i].next){
if(G[i].v!=fa)dfs(G[i].v,u);
}
T.del(len);
}
int main(){
freopen("balsuffix.in","r",stdin);
freopen("balsuffix.out","w",stdout);
M[]=;
for(int i=;i<N;i++)M[i]=M[i-]*bas;
T.ins();T.ins();int T=read();
while(T--){
n=read();for(int i=;i<=n;i++)head[i]=;tot=;
for(int i=;i<n;i++){
int u=read(),v=read();addedge(u,v);
}
scanf("%s",str+);
dfs(,);
for(int i=;i<=n;i++)printf("%d\n",Ans[i]);
}
}

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

  1. 【XSY2773】基因 后缀平衡树 树套树

    题目描述 有一棵树,每条边上面都有一个字母.每个点还有一个特征值\(a_i\). 定义一个节点\(i\)对应的字符串为从这个点到根的路径上所有边按顺序拼接而成的字符串\(s_i\). 有\(m\)次操 ...

  2. 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)

    模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...

  3. 3682: Phorni 后缀平衡树 线段树

    国际惯例的题面: 考虑如果没有强制在线我们能怎么水掉这个题,先构造出字符串,各种方法求一下后缀数组,然后线段树维护区间rank最小的位置即可.然而他要求强制在线,支持插入后缀,并比较后缀大小(求ran ...

  4. BZOJ3682 Phorni 后缀平衡树

    后缀平衡树的裸题 后缀平衡树简单的思想如下 具体的可以去看$clj$的论文 假设我们已经有了串$S$的后缀平衡树 插入一个字母$c$ 我们用$Si$代表原串$S$从第$i$个字符开始的后缀 则后缀$c ...

  5. UOJ#35 后缀排序

    这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 到 n. 除此之外为 ...

  6. 【sam复习】用sam实现后缀排序

    没错,一定是无聊到一定境界的人才能干出这种事情. 这个无聊的zcysky已经不满足于用后缀平衡树求sa了,他想用sam试试. 我们回顾下sam的插入过程,如果我们从最后一个state沿着suffix ...

  7. [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]

    题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...

  8. 北京培训记day5

    高级数据结构 一.左偏树&斜堆 orz黄源河论文 合并,插入,删除根节点 打标记 struct Node { int fa,l,r,w,dep } tree[Mx]; int Merge(in ...

  9. [BZOJ 3682]Phorni

    后缀平衡树的模板题? I'm so weak…… 现在觉得替罪羊树比 treap 好写,是不是没救了喵- #include <cstdio> #include <cmath> ...

随机推荐

  1. Chrome查看html样式基本操作-div

    1. div 标签(白板,块级标签),想学会前端,只需要学会div+css就可以了. span 标签 (白板,行内标签) 2. Chrome审查元素的使用.右击浏览器--检查---可以看标签是块级还是 ...

  2. python中元组与小括号的关系

    在学习Python 的时候.说到有两种数据类型,一种叫 列表,一种叫做元组,可以认为,元组是功能精简的列表.因为它少了列表很多功能.但是又有相识.定义他们的时候,主要是用中括号和小括号之分. 例如:定 ...

  3. 【题解】FJOI2015火星商店问题

    好几天之前做的题目了,一直想写一下博客也没腾出时间来,今天赶紧把坑给填上呼呼呼~ 这道题首先如果只考虑每个商店中没有时间限制的物品时,我们只需要使用一棵可持久化trie树来维护区间内的异或最大值即可, ...

  4. [SCOI2008]天平 差分约束

    ---题面--- 题解: 差分约束学得实在是太烂了,,,,QAQ 这里先记下: a - b >= x  ---> a >= b + x     ---->        b - ...

  5. Python type()函数用途及使用方法

    函数可以做什么 在介绍数据类型的文章中提到过,要怎么样查看对像的数据类型.type()就是一个最实用又简单的查看数据类型的方法.type()是一个内建的函数,调用它就能够得到一个反回值,从而知道想要查 ...

  6. BZOJ1012:[JSOI2008]最大数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1012 https://www.luogu.org/problemnew/show/P1198 现在 ...

  7. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  8. 【HASH】【UVA 10125】 Sumset

    传送门 Description 给定一个整数集合S,求一个最大的d,满足a+b+c=d,其中a,b,c,d∈S Input 多组数据,每组数据包括: 第一行一个整数n,代表元素个数 下面n行每行一个整 ...

  9. 一些实用的JQuery代码片段收集

    本文将展示50个非常实用的JQuery代码片段,这些代码能够给你的JavaScript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够 ...

  10. mybatis主键返回的实现

    向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...