分析

考虑按位处理,

如果熟悉dsu的话可以发现这道题能够用dsu做,

再用两个trie分别维护该位为0或1的字符串,

重儿子可以按照子树字符串的总长计算


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
const int N=100011,M=500011; typedef long lll; char s[M];
struct node{int y,next;}e[N<<1]; lll now,ans[N],siz[N];
int as[N],a[N],S,et=1,n,r[N],root,dep[N],fat[N],big[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(lll ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
struct Trie{
int tot,trie[M][26],cnt[M];
inline void Clear(){memset(trie[1],0,sizeof(trie[1])),cnt[tot=1]=0;}
inline void Insert(int L,int R){
rr int p=1; ++cnt[p];
for (rr int i=L;i<R;++i){
if (!trie[p][s[i]-97]){
trie[p][s[i]-97]=++tot,cnt[tot]=0,
memset(trie[tot],0,sizeof(trie[tot]));
}
p=trie[p][s[i]-97],++cnt[p];
}
}
inline signed query(int L,int R){
rr int p=1,sum=0;
for (rr int i=L;i<R;++i){
p=trie[p][s[i]-97];
if (!p) return sum;
sum+=cnt[p];
}
return sum;
}
}trie0,trie1;
inline void dfs1(int x,int fa){
dep[x]=dep[fa]+1,fat[x]=fa,siz[x]=r[x]-r[x-1];
for (rr int i=as[x],SIZ=-1;i;i=e[i].next)
if (e[i].y!=fa){
dfs1(e[i].y,x);
siz[x]+=siz[e[i].y];
if (siz[e[i].y]>SIZ) big[x]=e[i].y,SIZ=siz[e[i].y];
}
}
inline void updqry(int x){
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fat[x]&&e[i].y!=root) updqry(e[i].y);
if (a[x]&S) now+=trie0.query(r[x-1],r[x]),trie1.Insert(r[x-1],r[x]);
else now+=trie1.query(r[x-1],r[x]),trie0.Insert(r[x-1],r[x]);
}
inline void dfs2(int x,int opt){
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fat[x]&&e[i].y!=big[x]) dfs2(e[i].y,0);
if (big[x]) dfs2(big[x],1),root=big[x];
updqry(x),ans[x]+=now*S,root=0;
if (!opt) trie0.Clear(),trie1.Clear(),now=0;
}
signed main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
n=iut(),trie0.tot=trie1.tot=r[0]=1;
for (rr int i=1;i<=n;++i) a[i]=iut();
for (rr int i=1;i<=n;++i){
r[i]=r[i-1]; rr char c=getchar();
while (!isalpha(c)) c=getchar();
while (isalpha(c)) s[r[i]++]=c,c=getchar();
}
for (rr int i=1;i<n;++i){
rr int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et,
e[++et]=(node){x,as[y]},as[y]=et;
}
dfs1(1,0); for (S=1;S<N;S<<=1) dfs2(1,0);
for (rr int i=1;i<=n;++i) print(ans[i]),putchar(10);
return 0;
}

#树上启发式合并,trie#JZOJ 5363 生命之树的更多相关文章

  1. hdu6191(树上启发式合并)

    hdu6191 题意 给你一棵带点权的树,每次查询 \(u\) 和 \(x\) ,求以 \(u\) 为根结点的子树上的结点与 \(x\) 异或后最大的结果. 分析 看到子树,直接上树上启发式合并,看到 ...

  2. 算法学习笔记(19): 树上启发式合并(DSU on tree)

    树上启发式合并 DSU on tree,我也不知道DSU是啥意思 这是一种看似特别玄学的优化 可以把树上部分问题由 \(O(n^2)\) 优化到 \(O(n \log n)\). 例如 CodeFor ...

  3. dsu on tree 树上启发式合并 学习笔记

    近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数) ...

  4. 树上启发式合并(dsu on tree)学习笔记

    有丶难,学到自闭 参考的文章: zcysky:[学习笔记]dsu on tree Arpa:[Tutorial] Sack (dsu on tree) 先康一康模板题吧:CF 600E($Lomsat ...

  5. 神奇的树上启发式合并 (dsu on tree)

    参考资料 https://www.cnblogs.com/zhoushuyu/p/9069164.html https://www.cnblogs.com/candy99/p/dsuontree.ht ...

  6. Codeforces 208E - Blood Cousins(树上启发式合并)

    208E - Blood Cousins 题意 给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor.多次查询,给出 u k,问有多少个与 u 具有相同 k-ance ...

  7. Codeforces 600E - Lomsat gelral(树上启发式合并)

    600E - Lomsat gelral 题意 给出一颗以 1 为根的树,每个点有颜色,如果某个子树上某个颜色出现的次数最多,则认为它在这课子树有支配地位,一颗子树上,可能有多个有支配的地位的颜色,对 ...

  8. csu1811(树上启发式合并)

    csu1811 题意 给定一棵树,每个节点有颜色,每次仅删掉第 \(i\) 条边 \((a_i, b_i)\) ,得到两颗树,问两颗树节点的颜色集合的交集. 分析 转化一下,即所求答案为每次删掉 \( ...

  9. CF EDU - E. Lomsat gelral 树上启发式合并

    学习:http://codeforces.com/blog/entry/44351 E. Lomsat gelral 题意: 给定一个以1为根节点的树,每个节点都有一个颜色,问每个节点的子树中,颜色最 ...

  10. 【CodeChef EDGEST】Edges in Spanning Trees(树链剖分+树上启发式合并)

    点此看题面 大致题意: 给你两棵\(n\)个点的树,对于第一棵树中的每条边\(e_1\),求存在多少条第二棵树中的边\(e_2\),使得第一棵树删掉\(e_1\)加上\(e_2\).第二棵树删掉\(e ...

随机推荐

  1. Python2升级到Python3

    操作系统环境:CentOS Linux release 7.4.1708 (Core). 系统默认Python版本为2.7. 升级前的版本信息: [root@cch-spider-web1 ~]# l ...

  2. 异常处理try...except...finally---day26

    1.认识异常处理 # ### 认识异常处理 #IndexError 索引超出序列范围 #lst = [1,2,3,4] #print(lst[10]) #KeyError 字典中查找一个不存在的关键字 ...

  3. locals()用法

    views.py代码 def test(request): if request.method == 'GET': return render(request,'test.html') elif re ...

  4. C C++指针面试题零碎整理

    最基础的指针如下: int a; int* p = &a; 答:p指向a的地址,&是取a的地址.*指的是指针中取内容的符号. 2.str[]和str*的区别: char str1[] ...

  5. 【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析

    问题描述 Azure Function部署后未执行,查看日志发现错误信息: 2023-12-19T11:12:27.145 [Verbose] Host configuration applied.2 ...

  6. cpu过高什么原因?怎么排查?

    运行大型程序或应用程序:当计算机运行大型程序或应用程序时,CPU需要处理更多的数据和指令,因此CPU占用率会相应地增加. 病毒或恶意软件:某些病毒或恶意软件会占用计算机的CPU资源来执行恶意任务,例如 ...

  7. Jpackage-制作无需预装Java环境的Jar可执行程序

    JAR 包要在预装 JRE 环境的系统上执行.如果没有预先安装 JRE 环境,又想直接运行 Java 程序,该怎么办呢? 这篇文章我们会先学习如何将 Java 程序打包成一个可执行的 Java JAR ...

  8. 从零开始学Spring Boot系列-集成mybatis

    在Spring Boot的应用开发中,MyBatis是一个非常流行的持久层框架,它支持定制化SQL.存储过程以及高级映射.在本篇文章中,我们将学习如何在Spring Boot项目中集成MyBatis, ...

  9. 孔夫子旧书网书籍信息得爬取并保存为json,csv,excel多种文件格式

    python版本:3.7 需要得引入得包: from selenium import webdriver from selenium.common.exceptions import TimeoutE ...

  10. BKP备份寄存器&RTC实时时钟

    UNIX时间戳    time.h 三条路,上面主要作为系统时钟,中间的作为RTC时钟,下面的作为看门狗的时钟 与RTC有关的外部晶振(主电源断电不停)一般都i是32.768KHZ   2^15=32 ...