题意

传送门 Codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

题解

若某条路径的字符可以构成回文串,则至多一个字符数量为奇数,那么关注字符的奇偶性即可。设字符集的规模为 BBB,对字符集的奇偶性进行状态压缩,满足条件的两个字符集状态异或结果至多存在一个 111。若某个字符集的状态,O(B)O(B)O(B) 即可枚举满足条件的另一个状态。

dsu on tree 维护子树中各个节点字符集状态对应的最大深度,统计经过子树根节点的最长路径,最后用子孙节点的最长路径向上更新答案即可。总时间复杂度 O(BNlog⁡N)O(BN\log N)O(BNlogN)。

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int MAXN = 5E5 + 5, B = 22, SZ = 1 << B, _INF = 0xc0c0c0c0;
int N, dep[MAXN], sz[MAXN], a[MAXN];
int rec[SZ], res[MAXN], cur;
struct edge
{int to, c;
};
vector<edge> G[MAXN];void _max(int &x, int y) { x = max(x, y); }void pdfs(int v, int d, int s)
{dep[v] = d, sz[v] = 1, a[v] = s;for (auto &e : G[v])pdfs(e.to, d + 1, s ^ (1 << e.c)), sz[v] += sz[e.to];
}void count(int v, int p, bool rt)
{if (!rt){for (auto &e : G[v])count(e.to, p, 0);}_max(cur, dep[v] + rec[a[v]] - 2 * dep[p]);for (int i = 0; i < B; ++i){int t = a[v] ^ (1 << i);_max(cur, dep[v] + rec[t] - 2 * dep[p]);}
}void add(int v)
{_max(rec[a[v]], dep[v]);for (auto &e : G[v])add(e.to);
}void del(int v)
{rec[a[v]] = _INF;for (auto &e : G[v])del(e.to);
}void dfs(int v, bool keep)
{int mx = -1, ch = -1;for (auto &e : G[v])if (sz[e.to] > mx)mx = sz[e.to], ch = e.to;for (auto &e : G[v])if (e.to != ch)dfs(e.to, 0);if (ch != -1)dfs(ch, 1);cur = 0;for (auto &e : G[v])if (e.to != ch)count(e.to, v, 0), add(e.to);count(v, v, 1);_max(rec[a[v]], dep[v]);res[v] = cur;if (!keep)del(v);
}void get_res(int v)
{for (auto &e : G[v]){get_res(e.to);res[v] = max(res[v], res[e.to]);}
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> N;for (int i = 1; i < N; ++i){int p;char c;cin >> p >> c;G[p - 1].pb({i, c - 'a'});}pdfs(0, 0, 0);memset(rec, 0xc0, sizeof(rec));dfs(0, 0);get_res(0);for (int i = 0; i < N; ++i)cout << res[i] << (i + 1 == N ? '\n' : ' ');return 0;
}

Codeforces 741D dsu on tree相关推荐

  1. Codeforces 600E. Lomsat gelral(Dsu on tree学习)

    题目链接:http://codeforces.com/problemset/problem/600/E n个点的有根树,以1为根,每个点有一种颜色.我们称一种颜色占领了一个子树当且仅当没有其他颜色在这 ...

  2. Codeforces Round #383 (Div. 1): D. Arpa’s letter-marked tree…(dsu on tree+状压)

    题意: 给你一棵n个节点的树,每条边都代表着一个字母(a~v),对于每个节点u,求出以u为根的子树中有多少条路径满足:路径上的字符重新排列后可以得到一个回文字符串 思路: 前置:dsu on tree ...

  3. dsu on tree(Educational Codeforces Round 2: E. Lomsat gelral)

    题意: 一棵n个节点的树,每个节点都有一种颜色,如果颜色c在以u为根的子树中出现的次数大于等于一半,那么这个颜色就是u节点的支配色, 因为是大于等于,所以一个节点的支配色可能不止一种,求出每个节点的支 ...

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

    [题意]给定n个点的树,每条边有一个小写字母a~v,求每棵子树内的最长回文路径,回文路径定义为路径上所有字母存在一种排列为回文串.n<=5*10^5. [算法]dsu on tree [题解]这 ...

  5. 2020 China Collegiate Programming Contest Changchun F - Strange Memory(dsu on tree + 位运算小技巧)

    题目连接: https://codeforces.com/gym/102832/problem/F 首先写这个题的时候要注意内存的问题 不要瞎几把define int long long 题解: 考虑 ...

  6. 阔力梯的树(2020 CCPC Wannafly Winter Camp Day2 Div.12 )dsu on tree

    题解: dsu on tree dsu on tree的基本步骤就不说了 看到这题询问结点的子树问题,而且询问时离线的,首先想到的dsu on tree的这个trick. 本题的难题就是如何维护结点所 ...

  7. CF375D Tree and Queries(dsu on tree)

    题解: 个人感觉这个题目是一个挺不错的题的.(这里就不说dsu on tree的这个过程是什么了) 我们在dsu on tree计算答案时需要有一个小小技巧去优化一下时间复杂度. 就是当我们用一个cn ...

  8. CF570D Tree Requests(dsu on tree)

    题解: dsu on tree 首先dsu on tree是一个离线的算法,所以我们需要先把他们的询问储存起来,然后进行操作. 针对于每一个结点,我们先统计出他和他子树的所有信息,然后对于这个结点来说 ...

  9. dsu on tree 模板题目(CF600E Lomsat gelral)

    题解: dsu on tree 对于结点i来说,步骤为: 递归轻儿子,不保留贡献. 递归重儿子,保留贡献. 统计当前结点及所有轻儿子的贡献. 拿个样例来解释算法的流程 比如说样例2: 如图所示,有多个 ...

  10. 【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)

    [UOJ#388][UNR#3]配对树(线段树,dsu on tree) 题面 UOJ 题解 考虑一个固定区间怎么计算答案,把这些点搞下来建树,然后\(dp\),不难发现一个点如果子树内能够匹配的话就 ...

最新文章

  1. RXSwift基本使用1
  2. Java核心技术卷1——笔记(1)
  3. JSONP跨域的原理解析
  4. JavaWeb 后端 三 之 Response Request 学习笔记
  5. win8:querySelector()方法
  6. 竹林蹊径:深入浅出Windows驱动开发
  7. html调整浏览器兼容性,浏览器兼容性问题整理
  8. CGAL学习之路(三):CGAL读写点云
  9. matlab 仿真短路故障设置,基于MatlabSimulink的电力系统故障仿真与
  10. 无法启动此程序因为计算机丢失d3dx9,无法启动此程序.因为计算机中丢失d3dx9_43.dll.尝试重新安装改程序以解决问题...
  11. 计算机暑期学校心得,暑期学校培训心得体会(通用12篇)
  12. arXiv镜像加载慢的解决办法
  13. esp8266保存html文件,八,ESP8266 文件保存数据(示例代码)
  14. WinBUGS对多元随机波动率模型:贝叶斯估计与模型比较
  15. 第一次数据分析师面试
  16. 如何构建用户满意的“服务化”数据平台
  17. 记录一下自己常用的数据库,以备不时之需
  18. JavaScript:实现复制粘贴剪切功能
  19. 怎么做网站?做网站就是这么简单
  20. win服务器不能上传文件,Serv u无法上传文件的两种解决方案

热门文章

  1. 用devc++表白_【民大表白墙】表白七号楼332进门右面下铺哥哥的第四天。你再不来,我要下雪了。云雀叫了一整天。...
  2. 加密流量分类任务的深度学习方法(一般框架总结)
  3. 汽车行业中SOP和PT是什么意思?
  4. C 语言绝对值函数abs实现技巧
  5. C/C++ abs 函数 - C语言零基础入门教程
  6. 读取阿里云服务器图片到本地
  7. 163邮箱 java发送html邮件,java邮件发送 qq与163邮箱互发和qq和163邮箱发送其余邮箱实例...
  8. 性能测试tps上不去,又是redis的坑,说多了都是泪啊
  9. 发布海外媒体稿件更好帮助企业海外营销推广
  10. 产品读书《自控力:斯坦福大学最受欢迎的心理学课程》