题意:

给你一棵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+状压)相关推荐

  1. 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 ...

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

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

  3. Codeforces Round #383 (Div. 1) C(二分图)

    一道很巧妙的二分图的题目 简单分析性质可知,一个合法序列一定是由12,21这样的子串构成的,所以相邻的每隔2个两两配对 然后BF和GF互相配对,思考一下,如果存在奇环,那么必定有一个BG有两个GF,或 ...

  4. 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( ...

  5. Codeforces Round #225 (Div. 1) E. Vowels 容斥 + sosdp

    传送门 文章目录 题意: 思路: 题意: 给你nnn个长度为333的串,串的每个字母都在a−za-za−z范围内,定义一个串合法当且仅当这个串中含有至少一个元音字母.现在他忘记了元音字母都有那几个,显 ...

  6. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  7. 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 ...

  8. 构造 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 的例子可以 ...

  9. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

最新文章

  1. PE文件结构详解(三)
  2. Idea不能新建package的解决
  3. 小程序css中设置1rpx失效
  4. iPIN CEO 杨洋:AI 还未被大规模用在工作中,缺的是认知智能
  5. Linux学习记录-7
  6. linux基本指令chmod,Linux 常用命令
  7. Windows Phone开发(30):图形 转:http://blog.csdn.net/tcjiaan/article/details/7453028
  8. 搜狗手机输入法java_手机搜狗输入法制作个性皮肤的方法
  9. 哔哩下载姬(downkyi)v1.4.0 B站视频下载工具 哔哩哔哩视频解析
  10. 大数运算(加减乘除)
  11. 聊一聊我在腾讯的外包同事
  12. 服务器DNS域名解析
  13. python3版本升级_python版本升级到3.7
  14. ubuntu磁盘清理
  15. [编程题]evaluate-reverse-polish-notati
  16. 互动媒体技术A1作业报告
  17. windows下清除文件批处理命令
  18. CTF竞赛实战 中国菜刀与一句话木马
  19. java手机刷机精灵,按钮救星(按键精灵所有者读写权限)
  20. 从一个故事开始讲递归

热门文章

  1. python入门指南by许半仙-推文:拯救书荒(短篇小甜饼合集)
  2. python工资这么高为什么不学-为什么学Python的人越来越多?
  3. 自学python考哪些证书-学python需要考证吗?考证有什么好处?
  4. python从入门到精通需要多久-Python从入门到精通只需要一个月就够了!
  5. 学python需要什么基础-Python入门学习需要哪些条件?
  6. python3入门经典100例-Python3入门经典100例
  7. 未来语音识别技术的发展趋势将会怎样
  8. PUT与POST的相同点和不同点
  9. echarts 饼图
  10. 视频特性TI(时间信息)和SI(空间信息)的计算工具:TIandSI-压缩码流版