【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
题意:我们称一个字符串为周驿东串当且仅当重排它的字符可以组成一个回文串。
给出一个n个点的有根树,根为1,每条边上有一个从a到v的字符,求每个点的子树中所有简单路径可以组成的周驿东串中的最长长度。
n<=5e5
思路:https://www.cnblogs.com/zzqsblog/p/6146916.html
一个串为周驿东串当且仅当其中只有0/1个字符出现奇数次
将每个字母看成一个二进制位,设s[i]为根到i的边权xor和,对于固定的点x要在其子树中找到来自不同分支的a和b使得s[a]^s[b]为0或者2的次幂,且dep[a]+dep[b]-2*dep[x]最大
s[a]^s[b]的条件等价于s[a]=s[b]或者s[a]和s[b]只有1位不同
lca直接当做x算实际上的dep应该比算dep[x]大,答案会变大,需要先统计再更新
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,int>P;
#define N 500010
#define M 1000010
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1
#define S 1<<22 const ll MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int INF=<<;
ll inf=5e13;
int dx[]={-,,,};
int dy[]={,,-,}; char ch[];
int head[N],vet[M],nxt[M],len[M],tot;
int son[N],dep[N],s[N],size[N],skip;
int ans[N],mxdep[<<],now,t; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void add(int a,int b,int c)
{
nxt[++tot]=head[a];
vet[tot]=b;
len[tot]=c;
head[a]=tot;
} void dfs1(int u,int fa)
{
size[u]=;
int e=head[u];
while(e)
{
int v=vet[e];
if(v!=fa)
{
dep[v]=dep[u]+;
s[v]=s[u]^len[e];
dfs1(v,u);
size[u]+=size[v];
if(size[v]>size[son[u]]) son[u]=v;
}
e=nxt[e];
}
} void clr(int u)
{
mxdep[s[u]]=-INF;
} void update(int u)
{
t=max(t,mxdep[s[u]]+dep[u]-now*);
rep(i,,) t=max(t,mxdep[s[u]^(<<i)]+dep[u]-now*);
} void ins(int u)
{
mxdep[s[u]]=max(mxdep[s[u]],dep[u]);
} void solve(int u,int fa,int op)
{
if(op==) clr(u);
if(op==) update(u);
if(op==) ins(u);
int e=head[u];
while(e)
{
int v=vet[e];
if(v!=fa&&v!=skip) solve(v,u,op);
e=nxt[e];
}
} void dfs2(int u,int fa,int op)
{
int e=head[u];
while(e)
{
int v=vet[e];
if(v!=fa&&v!=son[u]) dfs2(v,u,);
e=nxt[e];
}
if(son[u])
{
dfs2(son[u],u,);
skip=son[u];
}
now=dep[u];
e=head[u];
while(e)
{
int v=vet[e];
if(v!=fa) ans[u]=max(ans[u],ans[v]);
e=nxt[e];
}
e=head[u];
while(e)
{
int v=vet[e];
if(v!=fa&&v!=son[u])
{
solve(v,u,);
solve(v,u,);
}
e=nxt[e];
}
update(u);
ins(u);
ans[u]=max(ans[u],t);
skip=;
if(!op)
{
solve(u,fa,);
t=-INF;
}
} int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout); rep(i,,S) mxdep[i]=-INF;
int n=read();
tot=;
rep(i,,n)
{
int x;
scanf("%d%s",&x,ch);
add(x,i,<<(ch[]-'a'));
add(i,x,<<(ch[]-'a'));
}
skip=t=now=;
dfs1(,);
dfs2(,,);
rep(i,,n) printf("%d ",ans[i]);
return ;
}
【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)的更多相关文章
- 【DSU on tree】【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
Description 给定一棵 \(n\) 个节点的树,每条边上有一个字符,字符集大小 \(22\),求每个节点的子树内最长的简单路径使得路径上的字符经过重排后构成回文串. Limitation \ ...
- 【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 [题解]这 ...
- 【cf741】D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
传送门 题意: 给出一颗以\(1\)为根的有根树,树边带有一个字符(\(a\)~\(v\))的信息. 输出对于每个结点,其子树内最长的简单路径并且满足边上的字符能够组成回文串. 思路: 显然最终的答案 ...
- CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
一棵根为1 的树,每条边上有一个字符(a-v共22种). 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串. 求每个子树中最长的Dokhtar-kosh路 ...
- Codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
感觉dsu on tree一定程度上还是与点分类似的.考虑求出跨过每个点的最长满足要求的路径,再对子树内取max即可. 重排后可以变成回文串相当于出现奇数次的字母不超过1个.考虑dsu on tree ...
- 【Apache】HTTPD 2.4.37 + OpenSSL 1.1.1 企业级安全配置(含TLS修复)
我为什么要写这一篇稿子? 为了避免更多的运维.开发者没能实现企业的信息安全,我将共享出我个人的HTTPD的安全修复(2.2和2.4差不太多就看2.4就好) 起因:我为某M工作,但因某M和testin合 ...
- 【开源】SoDiaoEditor 可能是目前最好用的开源电子病历编辑器(B/S架构)
此刻我的内心是忐忑的,这个标题给了我很大的压力,虽然很久以前我就在github上搜索一圈了,也没发现有其他更好的开源电子病历编辑器,如各位亲发现有更好的,烦请知会我一声. 该编辑器其实已经憋了很久了, ...
- 【转】【UML】使用Visual Studio 2010 Team System中的架构师工具(设计与建模)
Lab 1: 应用程序建模 实验目标 这个实验的目的是展示如何在Visual Studio 2010旗舰版中进行应用程序建模.团队中的架构师会通过建模确定应用程序是否满足客户的需求. 你可以创建不同级 ...
- 【Unity3D】Unity3D开发《我的世界》之六、创建地形(视频 + 源码)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_06.html 一.引入LibNoise 虽然Unity3D里也有一个Mathf.P ...
随机推荐
- 理解CSS中position的各个值
static position的默认值,没有定位,元素在normal flow中: fixed 相对于浏览器左上角定位: relative 相对定位元素,其位置根据其在normal flow中的位置来 ...
- Selenium WebDriver 常用API
public class Demo1 { WebDriver driver; @BeforeMethod public void visit(){ //webdriver对象的声明 System.se ...
- ELK 日志系统入门及通过 Docker 部署
1. ELK 系统是什么 ELK 是一套日志中心解决方案,其三个字母分别表示: Elasticsearch:负责日志存储及检索 Logstash:负责日志收集.过滤及格式化 Kibana:数据看板,负 ...
- XML scriptlet 连接数据库
<%@ page language="java" contentType="text/html" pageEncoding="GBK" ...
- SEC3 - MySQL常见命令
1.查看当前所有的数据库 show databases; 2. 打开指定的库名 use 库名称: 3.查看当前库中所有的表 show tables; 4. 查看其他库的所有表 show tables ...
- waf学习
参考文章: http://drops.xmd5.com/static/drops/tips-7883.html waf种类 云waf 传统安全厂商的硬件waf以及一直存在ips,ids设备 主机防护软 ...
- php编程怎么和mysql连接
php连接mysql的方法: MySQLi - 面向对象 MySQLi - 面向过程 关闭连接 连接在脚本执行完后会自动关闭.你也可以使用以下代码来关闭连接: (MySQLi - 面向对象 MySQL ...
- 链接层-UDP
五大特点:无连接,不可靠,面向报文传输,没有拥塞控制,首部开销小
- [51nod 1681]公共祖先(dfs序+线段树合并)
[51nod 1681]公共祖先(dfs序+线段树合并) 题面 给出两棵n(n<=100000)个点的树,对于所有点对求它们在两棵树中公共的公共祖先数量之和. 如图,对于点对(2,4),它们在第 ...
- 小Z的袜子(题解)(莫队)
小Z的袜子(题解)(莫队) Junlier良心莫队 题目 luoguP1494 [国家集训队]小Z的袜子 code #include<bits/stdc++.h> #define lst ...