jzoj5363

题目大意

定义
ansu=∑i∈decu∑j∈decu,i<j(vali⊕valj)×w(Si,Sj)ans_u=\sum_{i \in dec_u}\sum_{j \in dec_u,i<j}(val_i \oplus val_j)\times w(S_i,S_j) ansu​=i∈decu​∑​j∈decu​,i<j∑​(vali​⊕valj​)×w(Si​,Sj​)
其中 ⊕\oplus⊕为异或,decudec_udecu​表示uuu的子树,w(Si,Sj)w(S_i,S_j)w(Si​,Sj​)表示字符串SiS_iSi​和SjS_jSj​的最大公共前缀

求树上每个点对应的ansuans_uansu​

TJ

前置知识

w(Si,Sj)w(S_i , S_j)w(Si​,Sj​)显然可以用Trie维护,异或操作可以按位拆开计算答案。

方法一

考虑对每个点维护一棵Trie,于是将儿子的Trie合并时就可以计算答案

方法二

树上启发式合并

只维护一棵Trie,每到一个节点先递归计算其轻儿子的答案,计算前后要清空Trie,然后计算重儿子的答案,保留Trie,再将其他儿子的节点一一插入Trie中并计算答案即可

#include<bits/stdc++.h>
#define fo(i,a,b) for(ll i=a;i<=b;i++)
#define fd(i,a,b) for(ll i=a;i>=b;i--)
#define ll long long
const ll INF=1e9+7;
using namespace std;
const ll N=1e5;
const ll SZ=5e5;
const ll M=20;
char str[SZ+10];
ll l[N+10],v[N+10];
namespace TRIE{int ch[SZ+10][30],s[SZ+10][30],a[SZ+10],cnt;void init(ll t){memset(ch[t],0,sizeof(ch[t]));memset(s[t],0,sizeof(s[t]));a[t]=0;}ll add(ll t){ll x=1,sum=0;fo(i,l[t],l[t+1]-1){if(!ch[x][str[i]-'a']){ch[x][str[i]-'a']=++cnt;init(cnt);}x=ch[x][str[i]-'a'];fo(j,0,M){if((1<<j)&v[t]){sum+=(a[x]-s[x][j])*(1ll<<j);}else{sum+=s[x][j]*(1ll<<j);}}a[x]++;fo(j,0,M){if((1ll<<j)&v[t])s[x][j]++;}}return sum;}
}
struct edge{ll st,en,next;
}E[N*2+10];
ll n,tot,last[N+10],X,Y,fa[N+10],son[N+10],size[N+10];
ll len,ans[N+10],cnt,t[N+10],dfn[N+10];
void add(ll x,ll y){E[++tot]=(edge){x,y,last[x]};last[x]=tot;
}
void dfs1(ll x){dfn[x]=++cnt;t[cnt]=x;size[x]=1;for(ll p=last[x];p;p=E[p].next){ll y=E[p].en;if(y==fa[x])continue;fa[y]=x;dfs1(y);size[x]+=size[y];if(size[y]>size[son[x]])son[x]=y;}
}
void dfs2(ll x){for(ll p=last[x];p;p=E[p].next){ll y=E[p].en;if(y==fa[x] || y==son[x])continue;TRIE::cnt=1;TRIE::init(1);dfs2(y);
//      ans[x]+=ans[y];}TRIE::cnt=1;TRIE::init(1);if(son[x]){dfs2(son[x]);ans[x]+=ans[son[x]];for(ll p=last[x];p;p=E[p].next){ll y=E[p].en;if(y==fa[x] || y==son[x])continue;fo(i,dfn[y],dfn[y]+size[y]-1){ans[x]+=TRIE::add(t[i]);}}}ans[x]+=TRIE::add(x);
}
int main(){//  freopen("in.txt","r",stdin);freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);scanf("%lld",&n);fo(i,1,n)scanf("%lld",&v[i]);fo(i,1,n){l[i]=len+1;scanf("%s",str+len+1);len=strlen(str+1);}l[n+1]=len+1;fo(i,2,n){scanf("%lld%lld",&X,&Y);add(X,Y);add(Y,X);}dfs1(1);dfs2(1);fo(i,1,n)printf("%lld\n",ans[i]);return 0;
}

20201031B组 T3 生命之树相关推荐

  1. 【GDKOI2014】JZOJ2020年8月13日提高组T3 壕壕的寒假作业

    [GDKOI2014]JZOJ2020年8月13日提高组T3 壕壕的寒假作业 题目 Description Input Output 输出n行.第i行输出两个整数,分别表示第i份作业最早完成的时刻以及 ...

  2. JZOJ2020年8月11日提高组T3 页

    JZOJ2020年8月11日提高组T3 页 题目 Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场 ...

  3. JZOJ2020年8月10日提高组T3 玩诈欺的小杉

    JZOJ2020年8月10日提高组T3 玩诈欺的小杉 题目 Description 是这样的,在小杉的面前有一个N行M列的棋盘,棋盘上有N∗MN*MN∗M个有黑白棋的棋子(一面为黑,一面为白),一开始 ...

  4. JZOJ7月24日提高组T3 终章-剑之魂

    JZOJ7月24日提高组T3 终章-剑之魂 题目 题解 题意 分析 Code 题目 [背景介绍] 古堡,暗鸦,斜阳,和深渊-- 等了三年,我独自一人,终于来到了这里-- "终焉的试炼吗?就在 ...

  5. 【NOIP2013提高组T3】加分二叉树

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

  6. JZOJ Day4 B组 T3【五校联考1day1】我才不是萝莉控呢

    题目大意: 小YYY:"小RRR 你是萝莉控吗."小RRR:"-" 为了避免这个尴尬的话题,小RRR 决定给小YYY 做一道题. 有一个长度为nnn 的正整数数 ...

  7. 【bfs】重力球(luogu 7473/NOI Online 2021 普及组 T3)

    正题 luogu 7473 题目大意 给出一个正方形区域,中间有一些障碍 现在有两个球,每次操作可以使两个球同时向一个方向移动,直到遇到障碍或边界 现在问你让两个球到同一个位置最少要多少步 解题思路 ...

  8. 2019.5.11 提高B组 T3 nssl-1322 清兵线

    DescriptionDescriptionDescription 在一个数轴上有nnn个点,一开始在原点,走到每个点上可以获得m−tm-tm−t(ttt为移动的距离)的价值,求最大价值 数据范围:n ...

  9. [洛谷P1095]NOIP2007 普及组T3 守望者的逃离

    问题描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会 ...

  10. 2018年10月18日提高组 T3 摘果子

    大意 在选择一个东西前必须要选择另一样东西,选择一样东西可以获得一定的价值,但需要花费一定的代价. 求代价 ≤ m \leq m ≤m的最大价值 思路 有依赖性的背包问题(树形背包问题) 套模板(选课 ...

最新文章

  1. 用 PHP 读取 XML
  2. 学习CSS 不错网址
  3. js记录用户访问页面和停留时间
  4. java socket通信demo_Java Socket通信示例
  5. 解决faster-rcnn中训练时assert(boxes[:,2]=boxes[:,0]).all()的问题
  6. 如何挑选一款合适的POE工业级交换机?
  7. php 换行 PHP_EOL变量
  8. 计算机动画制作过程原理,计算机制作动画的基本原理及运动规律.ppt
  9. ReactJS基础(续)
  10. Linux如何产看系统信息
  11. MIME,拓展名需要相应的软件打开
  12. wps计算机打印双面输出,在wps中双面打印的方法步骤详解
  13. MapGIS目录的设置
  14. 最全的Magisk模块下载
  15. 为什么日本德国没有一流互联网企业?
  16. centos7系统文件名颜色含义
  17. Oracle 如何生成随机数字、字符串、日期、验证码以及 UUID
  18. Vue-报错1(命名规范)
  19. 记录一个关于oracle数据库us7ascii字符集解决的方法
  20. SpringMVC接受参数

热门文章

  1. 电子工程师的自我修养 - 20例电路讲解
  2. texLive使用一条龙
  3. 关于电感数字传感器的一些问题
  4. zabbix如何监控ip地址_zabbix 监控ip地址
  5. 二维数组与数组指针详解
  6. 荆州水文水位查询_长江水位实时查询网(长江水位公告实时查询)
  7. 地址总线、数据总线、控制总线详解
  8. 计算机应用基础 (2013),计算机应用基础
  9. 向量空间的基和维数例题_向量空间的基与维数.ppt
  10. 小功能--扫描二维码自动连接WiFi