Codeforces Round #383 (Div. 1): D. Arpa’s letter-marked tree…(dsu on tree+状压)
题意:
给你一棵n个节点的树,每条边都代表着一个字母(a~v),对于每个节点u,求出以u为根的子树中有多少条路径满足:路径上的字符重新排列后可以得到一个回文字符串
思路:
前置:dsu on tree
然后就可以思考该怎么O(n²)暴力了
因为只有22个字母,所以可以用一个数字代表当前哪些字母出现了奇数次,如果字典序第i个字母出现奇数次,那么第i位就为1,否则就为0,这样的话只要求出val[u]表示从u点到根的路径状态,如果val[u]^val[v]==0 或者val[u]^val[v]的二进制中只有1位是1,那么路径u到v就可以重排形成回文字符串
#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
vector<int> G[500005];
int val[4233333], dp[4233333];
int dep[500005], siz[500005], hson[500005], ans[500005];
void Sech1(int u, int p)
{int i, v;val[u] ^= val[p];siz[u] = 1, dep[u] = dep[p]+1;for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p)continue;Sech1(v, u);siz[u] += siz[v];if(siz[v]>siz[hson[u]])hson[u] = v;}
}
void Init(int u)
{int i, v;dp[val[u]] = -1044266558;for(i=0;i<G[u].size();i++){v = G[u][i];Init(v);}
}
void Update(int u)
{int i, v;dp[val[u]] = max(dp[val[u]], dep[u]);for(i=0;i<G[u].size();i++){v = G[u][i];Update(v);}
}
void Gao(int u, int now)
{int i, v;ans[now] = max(ans[now], dep[u]+dp[val[u]]);for(i=0;i<=21;i++)ans[now] = max(ans[now], dep[u]+dp[val[u]^(1<<i)]);for(i=0;i<G[u].size();i++){v = G[u][i];Gao(v, now);}
}
void Sech2(int u)
{int i, v;for(i=0;i<G[u].size();i++){v = G[u][i];if(v==hson[u])continue;Sech2(v);Init(v);}if(hson[u])Sech2(hson[u]);for(i=0;i<G[u].size();i++){v = G[u][i];if(v==hson[u])continue;Gao(v, u), Update(v);}dp[val[u]] = max(dp[val[u]], dep[u]);ans[u] = max(ans[u], dep[u]+dp[val[u]]);for(i=0;i<=21;i++)ans[u] = max(ans[u], dep[u]+dp[val[u]^(1<<i)]);ans[u] -= dep[u]*2;for(i=0;i<G[u].size();i++){v = G[u][i];ans[u] = max(ans[u], ans[v]);}
}
int main(void)
{char ch;int n, i, x;scanf("%d", &n);for(i=2;i<=n;i++){scanf("%d %c", &x, &ch);G[x].push_back(i);val[i] = 1<<(ch-'a');}memset(dp, -62, sizeof(dp));Sech1(1, 0);Sech2(1);for(i=1;i<=n;i++)printf("%d ", ans[i]);puts("");return 0;
}
Codeforces Round #383 (Div. 1): D. Arpa’s letter-marked tree…(dsu on tree+状压)相关推荐
- 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 ...
- Codeforces Codeforces Round #383 (Div. 2) E (DFS染色)
题目链接:http://codeforces.com/contest/742/problem/E 题意: 有一个环形的桌子,一共有n对情侣,2n个人,一共有两种菜. 现在让你输出一种方案,满足以下要求 ...
- Codeforces Round #383 (Div. 1) C(二分图)
一道很巧妙的二分图的题目 简单分析性质可知,一个合法序列一定是由12,21这样的子串构成的,所以相邻的每隔2个两两配对 然后BF和GF互相配对,思考一下,如果存在奇环,那么必定有一个BG有两个GF,或 ...
- Codeforces Round #383 Div.2 A-E 题解
A B C D E 这场题目不难,但是很有意思. A 求1378^n的个位数. 特判n=0n=0n=0的情况即可. int d[]={6,8,4,2}; int main(){ int n=read( ...
- Codeforces Round #225 (Div. 1) E. Vowels 容斥 + sosdp
传送门 文章目录 题意: 思路: 题意: 给你nnn个长度为333的串,串的每个字母都在a−za-za−z范围内,定义一个串合法当且仅当这个串中含有至少一个元音字母.现在他忘记了元音字母都有那几个,显 ...
- Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...
- Codeforces Round #563 (Div. 2)/CF1174
Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...
- 构造 Codeforces Round #302 (Div. 2) B Sea and Islands
题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...
- Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...
最新文章
- PE文件结构详解(三)
- Idea不能新建package的解决
- 小程序css中设置1rpx失效
- iPIN CEO 杨洋:AI 还未被大规模用在工作中,缺的是认知智能
- Linux学习记录-7
- linux基本指令chmod,Linux 常用命令
- Windows Phone开发(30):图形 转:http://blog.csdn.net/tcjiaan/article/details/7453028
- 搜狗手机输入法java_手机搜狗输入法制作个性皮肤的方法
- 哔哩下载姬(downkyi)v1.4.0 B站视频下载工具 哔哩哔哩视频解析
- 大数运算(加减乘除)
- 聊一聊我在腾讯的外包同事
- 服务器DNS域名解析
- python3版本升级_python版本升级到3.7
- ubuntu磁盘清理
- [编程题]evaluate-reverse-polish-notati
- 互动媒体技术A1作业报告
- windows下清除文件批处理命令
- CTF竞赛实战 中国菜刀与一句话木马
- java手机刷机精灵,按钮救星(按键精灵所有者读写权限)
- 从一个故事开始讲递归