「CF741DArpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths」
这题目名字怎么这么长
zky学长讲过的题
非常显然,就是重排之后能形成回文串的话,最多只能有一个字母出现奇数次
又发现这个字符集大小只有\(22\),于是套路的使用状压,把每一条边转化成一个二进制数,求一下根路径前缀异或和
由于异或的性质,我们想得到路径\((x,y)\)的异或值,只需要\(pre_x \bigoplus pre_y\)就可以了
于是我们\(dsu\ on\ tree\),统计一个子树里所有的\(pre\)之后枚举一下拼成什么就好了
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define LL long long
#define re register
#define maxn 500005
inline int read() {
int x=0;char c=getchar();while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int n,num,Son,ans;
struct E{int v,nxt,w;}e[maxn];
int head[maxn],pre[maxn],deep[maxn],mx[5000005],vis[5000005];
int sum[maxn],son[maxn],Ans[maxn];
inline void add(int x,int y,int z) {e[++num].v=y;e[num].w=z;e[num].nxt=head[x];head[x]=num;}
void dfs1(int x) {
sum[x]=1;int maxx=-1;
for(re int i=head[x];i;i=e[i].nxt) {
if(deep[e[i].v]) continue;
deep[e[i].v]=deep[x]+1;pre[e[i].v]=pre[x]^e[i].w;
dfs1(e[i].v);sum[x]+=sum[e[i].v];
if(sum[e[i].v]>maxx) maxx=sum[e[i].v],son[x]=e[i].v;
}
}
inline void ask(int x) {
if(vis[pre[x]]) ans=max(ans,deep[x]+mx[pre[x]]);
int now=pre[x];
for(re int i=0;i<22;i++)
if(vis[now^(1<<i)]) ans=max(ans,deep[x]+mx[now^(1<<i)]);
}
void calc(int x,int opt) {
if(opt==1) ask(x);
else mx[pre[x]]=0,vis[pre[x]]--;
for(re int i=head[x];i;i=e[i].nxt)
if(Son!=e[i].v) calc(e[i].v,opt);
}
void add(int x) {
mx[pre[x]]=max(mx[pre[x]],deep[x]);vis[pre[x]]++;
for(re int i=head[x];i;i=e[i].nxt) add(e[i].v);
}
void dfs(int x,int opt) {
for(re int i=head[x];i;i=e[i].nxt)
if(son[x]!=e[i].v) dfs(e[i].v,0);
if(son[x]) dfs(son[x],1);
Son=son[x],ans=0;ask(x);
mx[pre[x]]=max(mx[pre[x]],deep[x]);vis[pre[x]]++;
for(re int i=head[x];i;i=e[i].nxt)
if(son[x]!=e[i].v) calc(e[i].v,1),add(e[i].v);
Son=0;Ans[x]=ans-2*deep[x];
if(!son[x]) Ans[x]=0;
if(!opt) calc(x,0);
for(re int i=head[x];i;i=e[i].nxt) Ans[x]=max(Ans[x],Ans[e[i].v]);
}
int main() {
n=read();char ch;
for(re int fa,i=2;i<=n;i++)
fa=read(),ch=getchar(),add(fa,i,1<<(ch-'a'));
deep[1]=1,dfs1(1);dfs(1,1);
for(re int i=1;i<=n;i++) printf("%d ",Ans[i]);
return 0;
}
「CF741DArpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths」的更多相关文章
- CF 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [dsu on tree 类似点分治]
D. Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths CF741D 题意: 一棵有根树,边上有字母a~v,求每个子树中最长的边,满 ...
- Codeforces 741 D - Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
D - Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 思路: 树上启发式合并 从根节点出发到每个位置的每个字符的奇偶性记为每个位 ...
- CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 好像这个题只能Dsu On Tree? 有根树点分治 统计子树过x的 ...
- codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
题目链接:Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 第一次写\(dsu\ on\ tree\),来记录一下 \(dsu\ o ...
- codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(启发式合并)
codeforces 741D Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths 题意 给出一棵树,每条边上有一个字符,字符集大小只 ...
- CF 741 D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths http://codeforces.com/problemset/probl ...
- 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...
- 「CF741D」Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
传送门 Luogu 解题思路 考虑把22个字符状压下来,易知合法情况就是状态中之多有一个1,这个可以暴力一点判断23次. 然后后就是 dsu on the tree 了. 细节注意事项 咕咕咕 参考代 ...
- CF741DArpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(DSU on tree)
题目大意: 给定一个以1为根的树,每条路径上都有一个字符(a~v共22个)询问对于每一个子树内最长的路径上字母经排序后可以形成回文串的最长路径多长 解题思路: 假定给你一个字符串,如何判定其经打乱能否 ...
随机推荐
- SQL SERVER2014的安装
sqlserver2014安装 启动安装程序 下载sqlserver2014,双击startup.exe进行安装 系统配置检查器 使用系统配置检查器,看系统是否符合安装sqlserver2014的所有 ...
- lodop打印多页
定义全局变量 var loop = null; 加载时候打印 window.On_CLodop_Opened = function () { print(); //OpenPreview()是调用打印 ...
- Form身份验证
Forms身份验证Web.config<system.web><authentication mode="Forms"> <fo ...
- [javaSE] 数据结构(二叉查找树-插入节点)
二叉查找树(Binary Search Tree),又被称为二叉搜索树,它是特殊的二叉树,左子树的节点值小于右子树的节点值. 定义二叉查找树 定义二叉树BSTree,它保护了二叉树的根节点BSTNod ...
- 【我整理的java开源项目】
摘要: 1. 整理出一些使用比较广或者个人觉得比较好的java开源项目和资料供参考. 2. 如果你觉得好但是我没有列出的开源项目请告诉我,方便我添加到列表里. 3. 如果你发现信息描述有误请联系我,我 ...
- MySQL之多表查询练习
一.表格 表一 emp 表二 dept 表三 salgrade; 表四 年度利润表 二.习题 1. 查出至少有一个员工的部门.显示部门编号.部门名称.部门位置.部门人数. 2. 列出所有员工的姓名及 ...
- LeetCode SQL: Second Highest Salary
, NULL, salary) as `salary` from ( ,) tmp Write a SQL query to get the second highest salary from th ...
- 再谈javascript函数节流
之前写过但是不记得在哪了,今天同事要一个滑到页面底部加载更多内容的效果,又想起了这玩意儿,确实挺实用和常用的,谨此记之. 函数节流从字面上的意思就是节约函数的执行次数,其实现的主要思想是通过定时器阻断 ...
- [POI2005]AUT-The Bus
树状数组维护前缀最大值+扫描线DP #include"cstdio" #include"cstring" #include"iostream" ...
- bzoj一句话题解
发现好多人都在搞这个...本人也想来试试(Solved刚到70就搞这个靠不靠谱啊喂).会更新的.嗯. 1000-1029 1000 A+B problem (这个还需要一句话吗?). 1001 狼抓兔 ...