【题意】给定n个点的树,每条边有一个小写字母a~v,求每棵子树内的最长回文路径,回文路径定义为路径上所有字母存在一种排列为回文串。n<=5*10^5。

【算法】dsu on tree

【题解】这题经典套路就是按照22个字母个数的奇偶性压位,然后两段路径异或起来是0或1<<j就是合法路径。

dsu的时候每个点统计其子树内经过这个点的路径,注意包括从子树到该点终止的和该点自身也要算。

那么类似点分治的方式,算完重儿子后处理一下根,然后就一棵一棵轻儿子子树和之前的子树状态桶数组统计然后加入。

传递上去的时候需要特别注意,dsu是无法支持数组的整体位移的,解决方法一般是把统计从x到子树改为从根到子树,这样所有点都是一样的,不需要位移。

当然这就需要满足信息的可减性,而深度deep和异或xor都是满足的。(xor和deep的两点间路径转两点到根路径非常经典了)

复杂度O(n log n)。

#include<cstdio>
#include<cstring>
#include<algorithm>
bool isdigit(char c){return c>='0'&&c<='9';}
int read(){int s=0,t=1;char c;while(!isdigit(c=getchar()))if(c=='-')t=-1;do{s=s*10+c-'0';}while(isdigit(c=getchar()));return s*t;
}
using namespace std;
const int maxn=500010,inf=0x3f3f3f3f;
int n,sz[maxn],first[maxn],a[maxn],b[30],c[5000010],ans[maxn],w[maxn],fa[maxn],tot,deep[maxn];
struct edge{int v,from;}e[maxn*2];
void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}
void p(int &x,int y){if(x<y)x=y;}
void dfs_pre(int x){sz[x]=1;for(int i=first[x];i;i=e[i].from){deep[e[i].v]=deep[x]+1;a[e[i].v]^=a[x];dfs_pre(e[i].v);sz[x]+=sz[e[i].v];if(sz[e[i].v]>sz[w[x]])w[x]=e[i].v;}
}
void calc(int x,int tp){for(int j=0;j<=22;j++)p(ans[tp],deep[x]+c[a[x]^b[j]]);for(int i=first[x];i;i=e[i].from)calc(e[i].v,tp);
}
void add(int x,int k){if(k)p(c[a[x]],deep[x]);else c[a[x]]=-inf;for(int i=first[x];i;i=e[i].from)add(e[i].v,k);
}
void dfs(int x){for(int i=first[x];i;i=e[i].from)if(e[i].v!=w[x])dfs(e[i].v);if(w[x])dfs(w[x]);//
    p(c[a[x]],deep[x]);for(int j=0;j<=22;j++)p(ans[x],deep[x]+c[a[x]^b[j]]);for(int i=first[x];i;i=e[i].from)if(e[i].v!=w[x])calc(e[i].v,x),add(e[i].v,1);if(x!=w[fa[x]])add(x,0);
}
char s[10];
int main(){n=read();for(int i=2;i<=n;i++){fa[i]=read();if(fa[i])insert(fa[i],i);scanf("%s",s);a[i]=1<<(s[0]-'a');}b[22]=0;for(int j=0;j<=21;j++)b[j]=1<<j;for(int i=0;i<(1<<22);i++)c[i]=-inf;dfs_pre(1);dfs(1);for(int i=1;i<=n;i++)ans[i]-=2*deep[i];for(int i=n;i>=1;i--)p(ans[fa[i]],ans[i]);for(int i=1;i<=n;i++)printf("%d ",ans[i]);return 0;
}

View Code

即使信息满足可减性,dsu on tree也不能像点分治一样删除某棵子树信息,进去统计后再加回来。因为dsu on tree必须满足【不能遍历重儿子】,否则复杂度就会爆炸。

不过如果题目要求的是除了某棵子树外的信息,就可以做,先统计所有轻儿子做除了重儿子的,然后进重儿子后统计所有轻儿子,一个一个删除来做除了某个轻儿子的。

转载于:https://www.cnblogs.com/onioncyc/p/8909658.html

【CodeForces】741 D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)相关推荐

  1. 【Codeforces】Round #488 (Div. 2) 总结

    [Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...

  2. 【Codeforces】925A Stairs and Elevators【贪心】

    [Codeforces]925A Stairs and Elevators [题目大意] 在一个n*m的矩阵里,有clcl个楼梯和cece个电梯,电梯和楼梯可以到任意一层,给出clcl个楼梯的位置和c ...

  3. 【CodeForces】[546A]Soldier and Bananas

    直接运算 并没有什么弯 注意int就足以储存数据 不需要借钱时(n>res) 输出 0 #include<stdio.h> int main() {int k,n,w;while(s ...

  4. 【CodeForces】445B A Lot of Games 字典树博弈

    传送门:[CodeForces]445B  A Lot of Games 题目大意:两人一起构造一个串,每人每次向串的末尾放一个字母,必须保证放了这个字母后能够成所给的N个串的前缀,如果某个人不能放时 ...

  5. 【Python】python初学者应该知道与其他语言差异化的高效编程技巧(附测试代码+详细注释)

    目录 1. 交换变量 2. 集合去重 3. 列表推导.集合推导和字典推导 4. 统计字符串中各个字符出现的次数 5.优雅地打印JSON数据 6.行内的if语句 6. 符合正常逻辑的数值比较 7. 田忌 ...

  6. 【毕业设计】3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文)

    [毕业设计]3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文) 文章目录 [毕业设计]3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文) 任务书 设计说明书 ...

  7. 【考研】830 + 848 暨大2012-2022真题易混易错题总结(二)

    前言 以下题目,均源自于暨南大学 2012 - 2022 年的 830 + 848 真题.主要是对真题中易混易错题进行记录和总结. 分为三篇博文,此乃第二篇,真题是 2018 - 2020 年的,即 ...

  8. 【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(二弹)

    本文为原创文章,转载需要注明转载出处 前言:嵌入式开发是相比其他IT行业是比较难的行业,它不仅需要你去掌握软件的经验,还要去学习一些硬件的知识, 它是软件和硬件的一个粘合剂,起到一个至关重要的地位 下 ...

  9. 【毕业设计】39-基于单片机的智能小车寻迹系统的设计与实现(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)

    [毕业设计]39-基于单片机的智能小车寻迹系统的设计与实现(原理图工程+仿真工程+源代码+答辩论文+答辩PPT) 文章目录 [毕业设计]39-基于单片机的智能小车寻迹系统的设计与实现(原理图工程+仿真 ...

最新文章

  1. JavaScript继承的多种方式和优缺点
  2. 【Android 应用开发】Canvas 精准绘制文字 ( 文本边界坐标解析 | 绘图位置 )
  3. CentOS 7核心安装及基本配置
  4. Vision Transformer 论文
  5. java-StringBuffer构造方法
  6. python下划线怎么输入_python长的下划线怎么打
  7. JavaScript DOM介绍
  8. “约见”面试官系列之常见面试题之第六十五篇之ajax如何解析jsonp(建议收藏)
  9. 第一季6:海思方案中uboot、kernel和rootfs的烧写方法
  10. [转载]企业网站建设必知必会
  11. centos mysql php tomcat_CentOS 6.x使用yum快速安装Apache+PHP+Tomcat(JSP)+MySQL
  12. 采访《以魂为中心的领导力》作者之问答
  13. php代码连接mysql数据库,php连接mysql数据库代码
  14. ASP.NET AJAX Advance Tips Tricks (9) DropDownList在Firefox下的奇怪现象和解决方案——谁的BUG?...
  15. ASP.Net MVC-Web API使用Entity Framework时遇到Loop Reference
  16. JS编程练习题(javascript)
  17. py将dicm格式图片转为jpg格式
  18. python儿童编程入门-如何让孩子轻松学习Python编程
  19. 2022年电梯考试电梯检验员模拟题及答案
  20. element-UI 图标点击切换

热门文章

  1. myeclipse堆栈溢出
  2. PermGen space 与 Java heap space
  3. 面向对象下计算器的编码实现
  4. Debian/Ubuntu Apache Mod_Rewrite 安装
  5. (二)匈牙利算法简介
  6. stl之bit_vector原理及应用
  7. python 重命名文件出现乱码_下载的文件名总是「乱码」?这里有各平台的解决方法...
  8. OpenCV图像处理(17)—— 各种二值化对比
  9. 键盘可以实现向计算机输入数据判断,计算机应用基础—学习指南.docx
  10. sha1原型 c语言,SHA1算法实现(C语言)