博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
阅读量:6695 次
发布时间:2019-06-25

本文共 1375 字,大约阅读时间需要 4 分钟。

一棵根为1 的树,每条边上有一个字符(a-v共22种)。 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中最长的Dokhtar-kosh路径的长度。

 

如果重排后能构成回文串,那么出现奇数次的字符最多一个。用一个22位二进制数表示每一个字母出现的次数的奇偶,把一个点到根节点的路径的异或值记为$s[u]$,那么就是在子树里找到两个点使其$s$值异或之后1的个数不超过1个,那么用dsu on tree就可以了

记得最后别忘了用儿子的答案更新自己的

1 //minamoto 2 #include
3 #include
4 #include
5 #define inf -0x3f3f3f3f 6 using namespace std; 7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 8 char buf[1<<21],*p1=buf,*p2=buf; 9 template
inline bool cmax(T&a,const T&b){
return a
'z'||ch<'a');return ch;22 }23 char sr[1<<21],z[20];int C=-1,Z;24 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}25 void print(int x){26 if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;27 while(z[++Z]=x%10+48,x/=10);28 while(sr[++C]=z[Z],--Z);sr[++C]=' ';29 }30 const int N=5e5+5;31 int head[N],Next[N<<1],ver[N<<1],tot;32 inline void add(int u,int v){33 ver[++tot]=v,Next[tot]=head[u],head[u]=tot;34 }35 int sz[N],d[N],son[N],s[N],ans[N],f[N*20],a[N];char c[N];36 int mx,n,bin[30];37 void dfs1(int u,int fa){38 sz[u]=1,d[u]=d[fa]+1,s[u]=s[fa]^bin[a[u]];39 for(int i=head[u];i;i=Next[i]){40 int v=ver[i];dfs1(v,u);41 sz[u]+=sz[v];42 if(sz[son[u]]

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9817996.html

你可能感兴趣的文章
Java 设计模式之命令模式
查看>>
可能是把Java内存区域讲的最清楚的一篇文章
查看>>
PHP中的几个随机数生成函数
查看>>
Anaconda不同envs的pip和python的版本
查看>>
深度学习与神经网络:最值得关注的6大趋势
查看>>
给SUBVERSION-EDGE和GITLAB-CE增加多LDAP域认证支持的经历
查看>>
SQLServer之创建全文索引
查看>>
如何以并发方式在同一个流上执行多种操作?--复制流
查看>>
Spring Boot 参考指南(开发Web应用程序)
查看>>
策略模式总结
查看>>
javascript块级作用域处理闭包和释放内存的垃圾回收
查看>>
快速入门React
查看>>
正则表达式语法入门
查看>>
关于顶级、一级、二级域名如何理解?
查看>>
图解CRM(客户关系管理)全流程
查看>>
微信小程序开发BUG经验总结
查看>>
Python学习--最完整的基础知识大全
查看>>
自定义组件间通信
查看>>
记录一个未解决的错误
查看>>
Laravel 5.6 正式发布(文档翻译工作将在春节后启动)
查看>>