20201031B组 T3 生命之树
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 生命之树相关推荐
- 【GDKOI2014】JZOJ2020年8月13日提高组T3 壕壕的寒假作业
[GDKOI2014]JZOJ2020年8月13日提高组T3 壕壕的寒假作业 题目 Description Input Output 输出n行.第i行输出两个整数,分别表示第i份作业最早完成的时刻以及 ...
- JZOJ2020年8月11日提高组T3 页
JZOJ2020年8月11日提高组T3 页 题目 Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场 ...
- JZOJ2020年8月10日提高组T3 玩诈欺的小杉
JZOJ2020年8月10日提高组T3 玩诈欺的小杉 题目 Description 是这样的,在小杉的面前有一个N行M列的棋盘,棋盘上有N∗MN*MN∗M个有黑白棋的棋子(一面为黑,一面为白),一开始 ...
- JZOJ7月24日提高组T3 终章-剑之魂
JZOJ7月24日提高组T3 终章-剑之魂 题目 题解 题意 分析 Code 题目 [背景介绍] 古堡,暗鸦,斜阳,和深渊-- 等了三年,我独自一人,终于来到了这里-- "终焉的试炼吗?就在 ...
- 【NOIP2013提高组T3】加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- JZOJ Day4 B组 T3【五校联考1day1】我才不是萝莉控呢
题目大意: 小YYY:"小RRR 你是萝莉控吗."小RRR:"-" 为了避免这个尴尬的话题,小RRR 决定给小YYY 做一道题. 有一个长度为nnn 的正整数数 ...
- 【bfs】重力球(luogu 7473/NOI Online 2021 普及组 T3)
正题 luogu 7473 题目大意 给出一个正方形区域,中间有一些障碍 现在有两个球,每次操作可以使两个球同时向一个方向移动,直到遇到障碍或边界 现在问你让两个球到同一个位置最少要多少步 解题思路 ...
- 2019.5.11 提高B组 T3 nssl-1322 清兵线
DescriptionDescriptionDescription 在一个数轴上有nnn个点,一开始在原点,走到每个点上可以获得m−tm-tm−t(ttt为移动的距离)的价值,求最大价值 数据范围:n ...
- [洛谷P1095]NOIP2007 普及组T3 守望者的逃离
问题描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会 ...
- 2018年10月18日提高组 T3 摘果子
大意 在选择一个东西前必须要选择另一样东西,选择一样东西可以获得一定的价值,但需要花费一定的代价. 求代价 ≤ m \leq m ≤m的最大价值 思路 有依赖性的背包问题(树形背包问题) 套模板(选课 ...
最新文章
- 用 PHP 读取 XML
- 学习CSS 不错网址
- js记录用户访问页面和停留时间
- java socket通信demo_Java Socket通信示例
- 解决faster-rcnn中训练时assert(boxes[:,2]=boxes[:,0]).all()的问题
- 如何挑选一款合适的POE工业级交换机?
- php 换行 PHP_EOL变量
- 计算机动画制作过程原理,计算机制作动画的基本原理及运动规律.ppt
- ReactJS基础(续)
- Linux如何产看系统信息
- MIME,拓展名需要相应的软件打开
- wps计算机打印双面输出,在wps中双面打印的方法步骤详解
- MapGIS目录的设置
- 最全的Magisk模块下载
- 为什么日本德国没有一流互联网企业?
- centos7系统文件名颜色含义
- Oracle 如何生成随机数字、字符串、日期、验证码以及 UUID
- Vue-报错1(命名规范)
- 记录一个关于oracle数据库us7ascii字符集解决的方法
- SpringMVC接受参数