传送门

Description

Arpa has a rooted tree (connected acyclic graph) consisting of n vertices. The vertices are numbered 1 through n, the vertex 1 is the root. There is a letter written on each edge of this tree. Mehrdad is a fan of Dokhtar-kosh things. He call a string Dokhtar-kosh, if we can shuffle the characters in string such that it becomes palindrome.

He asks Arpa, for each vertex v, what is the length of the longest simple path in subtree of v that form a Dokhtar-kosh string.

题意:一棵根为\(1\) 的树,每条边上有一个字符(\(a-v\)共\(22\)种)。 一条简单路径被称为\(Dokhtar-kosh\)当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中最长的\(Dokhtar-kosh\)路径的长度。

Solution

所求的路径其实就是只有\(0/1\)个字符出现奇数次的字符串

发现最多只有\(22\)种字符,所以可以把一个点到根路径上字符的出现情况压成一个二进制数\(val_i\)

一个数位\(i\)为\(1\)表示路径上编号\(i\)的字符出现了奇数次

所以一条路径合法等价于\(val_a \ \ xor \ \ val_b=0 \ \ or \ \ 2^i\)

发现是静态的子树信息维护,可以采用\(dsu\ on \ tree\)

每个点只计算以这个点为\(LCA\)的最长路径,可以一个一个子树合并进来

维护一个\(mxdep_i\),表示\(val_x=i\)的最大的\(dep_x\)

对于\(dsu\ on \ tree\):

如果一个关于子树集合的询问满足

  1. 往一个集合里插入一个点是\(O(1)\)的

  2. 删除元素都是到空为止,且每个点的删除为\(O(1)\)

那么对于这个询问就可以做到\(O(nlog_2n)\)

因为每个点只会在轻边处被删除,因而最多被删除\(O(log_2n)\)次

Code 

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)>(b)?(b):(a))
#define reg register
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=5e5+5;
struct edge{int to,w,nex;}e[MN];
int n,en,hr[MN];
inline void ins(int x,int y,int w){e[++en]=(edge){y,w,hr[x]};hr[x]=en;}
int val[MN],dep[MN],mx[MN],siz[MN];
void dfs1(int x)
{
siz[x]=1;reg int i;
for(i=hr[x];i;i=e[i].nex)
val[e[i].to]=val[x]^(1<<e[i].w),
dep[e[i].to]=dep[x]+1,
dfs1(e[i].to),siz[x]+=siz[e[i].to],(siz[e[i].to]>siz[mx[x]])?mx[x]=e[i].to:0;
}
#define ri reg int i
int cx,mx_dep[1<<22],ans[MN],Dec;
void _cal(int x)
{
if(mx_dep[val[x]]) cx=max(cx,dep[x]+mx_dep[val[x]]-Dec);
for(ri=0;i<22;++i)if(mx_dep[val[x]^(1<<i)])cx=max(cx,mx_dep[val[x]^(1<<i)]+dep[x]-Dec);
}
void _upd(int x){mx_dep[val[x]]=max(dep[x],mx_dep[val[x]]);}
void cal(int x){_cal(x);for(ri=hr[x];i;i=e[i].nex)cal(e[i].to);}
void upd(int x){_upd(x);for(ri=hr[x];i;i=e[i].nex)upd(e[i].to);}
void clr(int x){mx_dep[val[x]]=0;for(ri=hr[x];i;i=e[i].nex)clr(e[i].to);}
void dfs2(int x,bool kep=0)
{
reg int i;
for(i=hr[x];i;i=e[i].nex) if(e[i].to!=mx[x]) dfs2(e[i].to);
if(mx[x]) dfs2(mx[x],1);Dec=dep[x]<<1;
for(i=hr[x];i;i=e[i].nex)cx=max(ans[e[i].to],cx);
for(i=hr[x];i;i=e[i].nex)if(e[i].to^mx[x])cal(e[i].to),upd(e[i].to);
_cal(x);_upd(x);ans[x]=cx;if(!kep)clr(x),cx=0;
}
int main()
{
n=read();reg int i,x;
for(i=2;i<=n;++i)x=read(),ins(x,i,getchar()-'a');
dfs1(1);dfs2(1);
for(i=1;i<=n;++i) printf("%d ",ans[i]);
return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

Codeforces Round #383 D的更多相关文章

  1. Codeforces Round #383 (Div. 2) 题解【ABCDE】

    Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...

  2. Codeforces Round #383 (Div. 2) C. Arpa's loud Owf and Mehrdad's evil plan —— DFS找环

    题目链接:http://codeforces.com/contest/742/problem/C C. Arpa's loud Owf and Mehrdad's evil plan time lim ...

  3. Codeforces Round #383 (Div. 2) A,B,C,D 循环节,标记,暴力,并查集+分组背包

    A. Arpa’s hard exam and Mehrdad’s naive cheat time limit per test 1 second memory limit per test 256 ...

  4. dfs + 最小公倍数 Codeforces Round #383 (Div. 2)

    http://codeforces.com/contest/742/problem/C 题目大意:从x出发,从x->f[x] - > f[f[x]] -> f[f[f[x]]] -& ...

  5. 01背包dp+并查集 Codeforces Round #383 (Div. 2)

    http://codeforces.com/contest/742/problem/D 题目大意:有n个人,每个人有重量wi和魅力值bi.然后又有m对朋友关系,朋友关系是传递的,如果a和b是朋友,b和 ...

  6. Codeforces Round #383 Div 1题解

    第一次打Div 1,感觉还是挺难的..把基础题打完就日常划水了.... [A. Arpa's loud Owf and Mehrdad's evil plan](http://codeforces.c ...

  7. Codeforces Round #383 (Div. 2)C. Arpa's loud Owf and Mehrdad's evil plan

    C. Arpa's loud Owf and Mehrdad's evil plan time limit per test 1 second memory limit per test 256 me ...

  8. Codeforces Codeforces Round #383 (Div. 2) E (DFS染色)

    题目链接:http://codeforces.com/contest/742/problem/E 题意: 有一个环形的桌子,一共有n对情侣,2n个人,一共有两种菜. 现在让你输出一种方案,满足以下要求 ...

  9. Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses —— DP(01背包)

    题目链接:http://codeforces.com/contest/742/problem/D D. Arpa's weak amphitheater and Mehrdad's valuable ...

  10. Codeforces Round #383 (Div. 2) B. Arpa’s obvious problem and Mehrdad’s terrible solution —— 异或

    题目链接:http://codeforces.com/contest/742/problem/B B. Arpa's obvious problem and Mehrdad's terrible so ...

随机推荐

  1. JavaScript字符串Format

    一直用C#编程,在日常字符串拼接中string.Format()一直是个很好用很常用的方法,不用自己+++,既影响开发效率也影响可读性 然而在js中并没有这样的函数可供使用,so整理了一个js的字符串 ...

  2. Bootstrap框架 简单使用

    目录 Bootstrap框架 简单使用 什么是Bootstrap 下载 Bootstrap 项目结构 Bootstrap 简单使用 表格格式 Bootstrap 按钮颜色 尺寸 Bootstrap框架 ...

  3. SVN上文件出现左侧黄色箭头右侧绿色箭头的双向箭头

    转自:https://blog.csdn.net/jiuweihu521/article/details/90902152 与资源库对比又没有要提交的东西,网上说删除这个目录,然后更新整个配置库..我 ...

  4. [C#(WinForm)]判断第一次启动程序

    来源:https://bbs.csdn.net/topics/220023353/(10楼) 在判断窗口上添加: string strIsFirstRun = "false"; b ...

  5. OSI7层模型和网络排错、网络安全

    1.OSI7层模型和网络排错 7层模型和网络排错 序号 层 网络排错举例 措施 1 物理层故障 查看链接状态发送和接收数据包 2 数据链路层故障 MAC冲突ADSL欠费网速没法协商一致计算机连接到错误 ...

  6. 浅析MySQL使用 GROUP BY 分组聚合与细分聚合

    原创文章,转载请注明出处:http://www.cnblogs.com/weix-l/p/7521278.html: 若有错误,请评论指出,谢谢! 1. 聚合函数(Aggregate Function ...

  7. 文件系统属性chattr权限

    命令格式 chattr [+-=] [选项] 文件名或目录名 + 增加权限 - 删除权限 = 等于某权限 i 如果对文件赋予i权限,那么不允许对文件进行删除.改名,也不能添加.修改数据:如果对目录添加 ...

  8. STM32+IAR 解决Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned

    在IAR中编译STM32工程,遇到 Error[Pe147]: declaration is incompatible with "__nounwind __interwork __soft ...

  9. Python爬虫的三种数据解析方式

    数据解析方式 - 正则 - xpath - bs4 数据解析的原理: 标签的定位 提取标签中存储的文本数据或者标签属性中存储的数据 正则 # 正则表达式 单字符: . : 除换行以外所有字符 [] : ...

  10. jqGrid行编辑配置,方法,事件

    行编辑可以在行修改后更新数据,如下图所示 用户用鼠标点击选择一行,jqGrid将可编辑的字段转换为数据输入单元,如上面图所示.不可编辑的列,如id,不会转为可输入单元,而是保持不变.可以通过配置col ...