CF914E Palindromes in a Tree
$ \color{#0066ff}{ 题目描述 }$
给你一颗 n 个顶点的树(连通无环图)。顶点从 1 到 n 编号,并且每个顶点对应一个在‘a’到‘t’的字母。 树上的一条路径是回文是指至少有一个对应字母的排列为回文。 对于每个顶点,输出通过它的回文路径的数量。 注意:从u到v的路径与从v到u的路径视为相同,只计数一次。
\(\color{#0066ff}{输入格式}\)
第一行包含一个整数n(2<=n<=2*10^5)。 接下来的 n-1 行,每行包含两个整数u和v(1<=u,v<=n,u≠v)表示一条连接u和v的边。保证给出的图是一棵树。 再下一行包含一个n个字符的字符串,第i个字符对应第i个顶点。
\(\color{#0066ff}{输出格式}\)
输出一行,包含n个整数,第i个数表示经过顶点i的回文路径数量。
\(\color{#0066ff}{输入样例}\)
5
1 2
2 3
3 4
3 5
abcbb
7
6 2
4 3
3 7
5 2
7 2
1 4
afefdfs
\(\color{#0066ff}{输出样例}\)
1 3 4 3 3
1 4 1 1 2 4 2
\(\color{#0066ff}{数据范围与提示}\)
In the first sample case, the following paths are palindromic:
\(2−3−4\)
\(2−3−5\)
\(4−3−5\)
Additionally, all paths containing only one vertex are palindromic. Listed below are a few paths in the first sample that are not palindromic:
\(1−2−3\)
\(1−2−3−4\)
\(1−2−3−5\)
4000ms / 256MB
\(\color{#0066ff}{题解}\)
看到时限还有求树链的个数,肯定是点分治跑不了了
对于当前点,把它到所有点的树链的状态搜出来存入桶中
然后开始统计经过他的链对所有点的贡献
对于每棵子树,先dfs一遍消去子树对桶的贡献(统计的是子树间的链)
然后开始统计贡献
假如当前点是u,对于任意子树中的某一点v,如果v的子树中某点k,\(u-k\)的链合法,那么实际上v也要+1,所以说一个点的贡献不仅仅是自己到u和其它子树到u的贡献,还有自己的孩子到u和其它子树到u的贡献,也就是说,贡献还要加上子树的贡献和!
对于u自己的贡献还有单链的贡献,可以单独考虑
统计完贡献, 恢复这个子树对桶的贡献,继续下一子树
全弄完,再整个dfs一遍清空桶,分治子节点
#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int maxn = 2e5 + 10;
struct node {
int to;
node *nxt;
node(int to = 0, node *nxt = NULL): to(to), nxt(nxt) {}
};
node *head[maxn];
std::vector<int> v, vv;
LL ans[maxn];
int val[maxn], sum, root;
int t[1 << 21], f[maxn], siz[maxn];
bool vis[maxn];
int n;
void add(int from, int to) {
head[from] = new node(to, head[from]);
}
int getch() {
char ch;
while(!isalpha(ch = getchar()));
return ch - 'a';
}
void getroot(int x, int fa) {
siz[x] = 1, f[x] = 0;
for(node *i = head[x]; i; i = i->nxt) {
if(i->to == fa || vis[i->to]) continue;
getroot(i->to, x);
siz[x] += siz[i->to];
f[x] = std::max(f[x], siz[i->to]);
}
f[x] = std::max(f[x], sum - siz[x]);
if(f[x] < f[root]) root = x;
}
void dfs(int x, int fa, int zt) {
v.push_back(zt);
vv.push_back(zt);
for(node *i = head[x]; i; i = i->nxt) {
if(i->to == fa) continue;
dfs(i->to, x, zt ^ (1 << val[i->to]));
}
}
void build(int x, int fa, int zt, int k) {
t[zt ^ (1 << val[x])] += k;
for(node *i = head[x]; i; i = i->nxt) {
if(i->to == fa || vis[i->to]) continue;
build(i->to, x, zt ^ (1 << val[x]), k);
}
}
int getans(int x, int fa, int zt) {
int tot = t[zt ^ (1 << val[x])];
for(int k = 0; k <= 19; k++) tot += t[zt ^ (1 << val[x]) ^ (1 << k)];
for(node *i = head[x]; i; i = i->nxt) {
if(i->to == fa || vis[i->to]) continue;
tot += getans(i->to, x, zt ^ (1 << val[x]));
}
ans[x] += tot;
return tot;
}
void calc(int x) {
build(x, 0, 0, 1);
int tot = t[0];
for(int i = 0; i <= 19; i++) tot += t[1 << i];
for(node *i = head[x]; i; i = i->nxt) {
if(vis[i->to]) continue;
build(i->to, x, 1 << val[x], -1);
tot += getans(i->to, x, 0);
build(i->to, x, 1 << val[x], 1);
}
ans[x] += tot >> 1;
build(x, 0, 0, -1);
}
void work(int x) {
vis[x] = true;
calc(x);
for(node *i = head[x]; i; i = i->nxt) {
if(vis[i->to]) continue;
sum = siz[i->to], root = 0;
getroot(i->to, x);
work(root);
}
}
int main() {
n = in();
int x, y;
for(int i = 1; i < n; i++) x = in(), y = in(), add(x, y), add(y, x);
for(int i = 1; i <= n; i++) val[i] = getch();
root = 0, sum = f[0] = n;
getroot(1, 0);
work(root);
for(int i = 1; i <= n; i++) printf("%lld%c", ans[i] + 1, i == n? '\n' : ' ');
return 0;
}
CF914E Palindromes in a Tree的更多相关文章
- CF914E Palindromes in a Tree(点分治)
link 题目大意:给定一个n个点的树,每个点都有一个字符(a-t,20个字符) 我们称一个路径是神犇的,当这个路径上所有点的字母的某个排列是回文 求出对于每个点,求出经过他的神犇路径的数量 题解: ...
- CF914E Palindromes in a Tree(点分治)
题面 洛谷 CF 题解 题意:给你一颗 n 个顶点的树(连通无环图).顶点从 1 到 n 编号,并且每个顶点对应一个在'a'到't'的字母. 树上的一条路径是回文是指至少有一个对应字母的排列为回文. ...
- 【CodeForces】914 E. Palindromes in a Tree 点分治
[题目]E. Palindromes in a Tree [题意]给定一棵树,每个点都有一个a~t的字符,一条路径回文定义为路径上的字符存在一个排列构成回文串,求经过每个点的回文路径数.n<=2 ...
- codeforces 914E Palindromes in a Tree(点分治)
You are given a tree (a connected acyclic undirected graph) of n vertices. Vertices are numbered fro ...
- Palindromes in a Tree CodeForces - 914E
https://vjudge.net/problem/CodeForces-914E 点分就没一道不卡常的? 卡常记录: 1.把不知道为什么设的(unordered_map)s换成了(int[])s ...
- Codeforces914E. Palindromes in a Tree
n<=100000的树,每个点上有个字母a-t之一,问有多少这样的链经过每个点:它的某一个排列的字母串起来是回文的. 就是有最多一个字母是奇数个啦..这样点分算一波即可..细节较多详见代码 #i ...
- ghj1222被坑记录[不持续更新]
考试注意事项:link1 link2 (密码:wangle) 调不出来bug,可以先透彻一会儿或者是上个厕所或者坐一会别的题(间隔至少20min),然后通读代码 -1. 考试先读题,读题之后搞出一个做 ...
- CodeChef Tree Palindromes
Tree Palindromes Given a tree rooted at node 1 with N nodes, each is assigned a lower case latin cha ...
- 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分
树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...
随机推荐
- 1.forEach():遍历数组,并为每个元素调用传入的函数; 举例:
var a = [1,2,3]; var sum = 0; //传一个参数 a.forEach(function(v){ sum += v; }); console.log(sum);//6 //传三 ...
- 15-EasyNetQ之对延迟消息插件的支持
RabbitMQ延迟消息插件仍然在实验阶段.你使用这个功能要自担风险. RabbitMQ延迟消息插件为RabbitMQ增加了新的交换机类型,允许延时消息投递. EasyNetQ为交换机通过定义一种新的 ...
- ubuntu 14.04 安装压缩包版mysql
既有环境: 1)下载MySQL Community Server 5.6.17 压缩版(mysql-5.6.17-linux-glibc2.5-x86_64.tar.gz) 2)安装目录: /opt/ ...
- sendCloud群发邮件一点总结
1.群发时,若发送的邮件为html页面,则不能用[普通发送]然后foreach循环: 若是单纯的文本,则可以用普通发送,否则,第一封邮件成功后,后面的都是html乱码. 2.若要用html模板发送,可 ...
- Java对象的强、软、弱和虚引用
本文介绍Java对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.Java对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象 ...
- std:: lower_bound std:: upper_bound
std:: lower_bound 该函数返回范围内第一个不小于(大于或等于)指定val的值.如果序列中的值都小于val,则返回last.序列应该已经有序! eg: #include <iost ...
- CMD指令大全
命令提示符(CMD)是在OS / 2 , Windows CE与Windows NT平台为基础的操作系统(包括Windows 2000和XP中, Vista中,和Server 2003 )下的“MS- ...
- App测试从入门到精通之App分类和场景操作系统
App概要 APP是application的缩写.通常指的是手机软件上的应用,或称为手机客户端.手机app就是手机的应用程序.随着智能手机的越发普及,用户越发依赖手机软件商品店,app开发的需求与发展 ...
- Linux下为Eclipse安装hadoop插件
前提条件:在Linux系统中已经安装好了jdk和hadoop 本文的安装环境:1.arch Linux 2. hadoop1.0.1本地伪分布模式安装 3. Eclipse 4.5 1. 下载Ecl ...
- 明码——第九届蓝桥杯C语言B组(省赛)第二题
原创 标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛.16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. 一个字节可以存储8位信息,用32个字 ...