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
思路:
树上启发式合并
从根节点出发到每个位置的每个字符的奇偶性记为每个位置的状态,每次统计一下每个状态的最大深度
为了保证链经过当前节点u,我们先计算每个子树的答案,再更新子树状态对深度的贡献。
代码:
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
//#define mp make_pair
#define pb push_back
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdi pair<double, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head inline int read() {
int a = , b = ;
char ch = getchar();
while(ch < '' || ch > '') {
if(ch == '-') a = -;
ch = getchar();
}
while('' <= ch && ch <= '') {
b = b* + ch-'';
ch = getchar();
}
return a*b;
}
const int N = 5e5 + , M = 5e6 + ;
const int INF = 1e8;
vector<pii> g[N];
int n, p, dp[N], sz[N], son[N], deep[N], st[N], mx[M];
char c[];
void get_son(int u, int o) {
sz[u] = ;
deep[u] = deep[o] + ;
for (int i = ; i < g[u].size(); ++i) {
int v = g[u][i].fi;
int w = g[u][i].se;
st[v] = st[u] ^ (<<w);
get_son(v, u);
if(sz[v] > sz[son[u]]) son[u] = v;
sz[u] += sz[v];
}
}
void CAL(int p, int u) {
if(mx[st[u]] >= ) dp[p] = max(dp[p], mx[st[u]]+deep[u]-*deep[p]);
for (int i = ; i < ; ++i) {
if(mx[st[u]^(<<i)] >= ) dp[p] = max(dp[p], mx[st[u]^(<<i)]+ deep[u]-*deep[p]);
}
for (int i = ; i < g[u].size(); ++i) {
int v = g[u][i].fi;
CAL(p, v);
}
}
void ADD(int u) {
mx[st[u]] = max(mx[st[u]], deep[u]);
for (int i = ; i < g[u].size(); ++i) {
int v = g[u][i].fi;
ADD(v);
}
}
void DELETE(int u) {
if(mx[st[u]] >= ) mx[st[u]] = -INF;
for (int i = ; i < g[u].size(); ++i) {
int v = g[u][i].fi;
DELETE(v);
}
}
void dfs(int u) {
for (int i = ; i < g[u].size(); ++i) {
int v = g[u][i].fi;
if(v != son[u]) {
dfs(v);
DELETE(v);
}
} if(son[u]) dfs(son[u]); if(mx[st[u]] >= ) dp[u] = mx[st[u]] - deep[u];
for (int i = ; i < ; ++i) {
if(mx[st[u]^(<<i)] >= ) dp[u] = max(dp[u], mx[st[u]^(<<i)] - deep[u]);
} mx[st[u]] = max(mx[st[u]], deep[u]);
for (int i = ; i < g[u].size(); ++i) {
int v = g[u][i].fi;
if(v != son[u]) {
CAL(u, v);
ADD(v);
}
}
for (int i = ; i < g[u].size(); ++i) {
int v = g[u][i].fi;
dp[u] = max(dp[u], dp[v]);
}
}
int main() {
n = read();
for (int i = ; i <= n; ++i) {
p = read();
scanf("%s", c);
g[p].pb({i, c[]-'a'});
}
get_son(, );
for (int i = ; i < M; ++i) mx[i] = -INF;
dfs();
for (int i = ; i <= n; ++i) printf("%d%c", dp[i], " \n"[i==n]);
return ;
}
Codeforces 741 D - 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 ...
- 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 题意 给出一棵树,每条边上有一个字符,字符集大小只 ...
- 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 ...
- 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,求每个子树中最长的边,满 ...
- 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的 ...
- 【42.86%】【codeforces 742D】Arpa's weak amphitheater and Mehrdad's valuable Hoses
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【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 [题解]这 ...
- 【题解】Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths Codeforces 741D DSU on Tree
Prelude 很好的模板题. 传送到Codeforces:(* ̄3 ̄)╭ Solution 首先要会DSU on Tree,不会的看这里:(❤ ω ❤). 众所周知DSU on Tree是可以用来处 ...
- Codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
感觉dsu on tree一定程度上还是与点分类似的.考虑求出跨过每个点的最长满足要求的路径,再对子树内取max即可. 重排后可以变成回文串相当于出现奇数次的字母不超过1个.考虑dsu on tree ...
随机推荐
- 一位数组的最大子数组(debug版)
package 数组; import java.util.Arrays; import java.util.Scanner; public class Sum { public static void ...
- IMU 标定 | 工业界和学术界有什么不同?
点击"计算机视觉life"关注,置顶更快接收消息! 由于格式问题最好在公众号上观看<IMU 标定-工业界和学术界有什么不同?> 本文主要介绍了IMU基本结构原理和误差的 ...
- Kafka笔记8(管理Kafka)
使用kafka-topic.sh工具可以执行大部分操作 创建/修改/删除/查看集群里的主题.要使用全部功能,需要通过--zookeeper参数提供zookeerper连接字符串 创建主题: 创建主 ...
- web框架实现购物车数量加减
企业开发中经常是团队协作,每个人分配一个小的模块,比如说购物车模块,数量加减这一块人们首先想到的就是通过jquery实现,其实作为一个后端接口开发的程序猿也可以用自己更擅长的后端的逻辑代码来实现,那我 ...
- 在Ubuntu中,vi命令编辑异常
在Ubuntu中,进入vi命令的编辑模式,发现按方向键不能移动光标,而是会输出ABCD,以及退格键也不能正常删除字符.这是由于Ubuntu预装的是vim-tiny,而我们需要使用的是vim-full, ...
- laravel blog edit
模板复制create的模板 主要修改的地方 <form action="{{ url('admin/article/'.$article->id) }}" method ...
- html-webpack-plugin 遇到 throw new Error('Cyclic dependency' + nodeRep)
今天遇到了 html-webpack-plugin 遇到 throw new Error('Cyclic dependency' + nodeRep) 错. 刚查到一篇文章,<手摸手,带你用合理 ...
- CCF CSP 201809-2 买菜
题目链接:http://118.190.20.162/view.page?gpid=T78 问题描述 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广 ...
- LINUX 编程定位工具gstack,pstack
pstack: pstack命令可显示每个进程的栈跟踪. pstack 命令必须由相应进程的属主或 root 运行. 可以使用 pstack 来确定进程挂起的位置. 此命令允许使用的唯一选项是要检查的 ...
- sqlServer区分大小写查询
sql server默认不区分大小写查询,但是有的时候部分查询语句却需要区分大小写查询,这个时候就需要进行一些特殊处理.区分大小写主要分两种方法. 转二进制判断 select * from table ...