Xor路
Xor路
(xor.pas/c/cpp)128MB1s
给定一棵有N个点和N-1条边的树,请你求出树中的最长路径,以及总共有多少条最长路径。
这里路径长度是用xor定义的,即若经过的边的权值为a1, a2, a3,...,an,则这条路径的总权值为 a1 xor a2 xor a3 ... xor an。
输入格式
第1行为一个正整数 N,为点的个数。
第2行至第N行,每行包含三个正整数x,y,z,表示x和y之间有一条权值为z的边。
输出格式
仅一行,包含两个数字,为最长路径的长度和条数。
样例输入
4
1 2 3
2 4 1
1 3 4
样例输出
7 1
样例解释
2-1-3 这条路径,长度为3 xor 4=7。

————————————————————————————————————————————————
首先xor满足 a&a=0
这样之后我们求两个点之间的路径就可以随便找一个点作为树的跟两个点之间的路径就是两个点到跟的路径的xor
这样问题就转换成了给你n个数求两个点亦或和最大值以及方案数
这个n^2明显会超时 但是利用xor的性质 我们可以利用tire来维护 复杂度nlogn
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=3e5+;
int n,x,y,vis[M],q[M];
LL l[][],h[];
LL T,w,d[M],mx,ans,sum;
int first[M],cnt;
struct node{int to,next; LL w;}e[*M];
void ins(int a,int b,LL w){cnt++; e[cnt].to=b; e[cnt].w=w; e[cnt].next=first[a]; first[a]=cnt;}
void insert(int a,int b,LL w){ins(a,b,w); ins(b,a,w);}
void spfa(){
int head=,tail=;
q[]=; vis[]=;
while(head!=tail){
int x=q[head++]; if(head>M) head=;
for(int i=first[x];i;i=e[i].next){
int now=e[i].to;
if(vis[now]) continue;
vis[now]=; q[tail++]=now; d[now]=d[x]^e[i].w;
if(tail>M) tail=;
}
}
}
void insert(int num){
int x=,now;
for(int i=;i>=;i--){
now=(num&(<<i))>>i;
if(!l[x][now]) l[x][now]=++sum;
x=l[x][now];
}
h[x]++;
}
int find(int num){
int x=,now;
for(int i=;i>=;i--){
now=(num&(<<i))>>i;
if(l[x][!now]) x=l[x][!now],T+=(<<i);
else x=l[x][now];
}
return h[x];
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d %d %lld",&x,&y,&w),insert(x,y,w);
spfa();
for(int i=;i<=n;i++) insert(d[i]);
for(int i=;i<=n;i++){
T=; int p=find(d[i]);
if(T>mx) mx=T,ans=p;
else if(T==mx) ans+=p;
}
printf("%lld %lld\n",mx,ans>>);
return ;
}
Xor路的更多相关文章
- 【BZOJ 2115】【WC 2011】Xor
计算1到n的一条路径使得路径上的值xor和最大. 先任意走一条路径计算xor和,然后dfs的时候处理出所有的环的xor和,这样对于所有的环的xor和求线性基,在任意走出的路径的xor和上贪心即可. 正 ...
- 【BZOJ-2115】Xor 线性基 + DFS
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2142 Solved: 893[Submit][Status] ...
- BZOJ2115 [Wc2011] Xor
Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...
- HDU 4825 Xor Sum(经典01字典树+贪心)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ...
- BZOJ 2115: [Wc2011] Xor
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2794 Solved: 1184 [Submit][Stat ...
- BZOJ.2115.[WC2011]Xor(线性基)
题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Soluti ...
- GO语言的进阶之路-网络安全之proxy
GO语言的进阶之路-网络安全之proxy 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在党的带领下,我们大陆的孩子身心健康还是杠杠的,尤其是像我这种农村孩纸,从来不会像<人 ...
- P4151 [WC2011]最大XOR和路径
P4151 [WC2011]最大XOR和路径 一道妙极了的题. 首先直接从1走到n 然后现在图上有很多环 所以可以在走到n之后走到环上一个点,再走一遍环,再原路返回.这样就会xor上环的权值. 然后只 ...
随机推荐
- linux下避免僵尸进程的几种方法
linux下我们可以调用fork函数创建子进程,创建的子进程将会得到父进程的数据空间.堆.栈......副本(采用写时复制机制),子进程将会继承父进程的信号掩码.信号处理方式.当前工作目录.会话id. ...
- 网络流_spfa最小费用最大流
最大流: 不断搜索增广路,寻找最小的容量-流量,得到最大流量,但最大流量在有花费时不一定是最小花费. 最小费用最大流 算法思想: 采用贪心的思想,每次找到一条从源点到达汇点的花费最小的路径,增加流量, ...
- mysql 绿色版 安装
1.下载mysql的绿色版压缩包.(自行百度) 2.自行规划目录解压 3.安装 注意:我遇到的两种版本的安装方法(暂时按照解压后的目录中是否含有data目录来区分) 3.1 无data目录(我用到的的 ...
- ASP.NET Core模块化前后端分离快速开发框架介绍之2、快速创建一个业务模块
源码地址 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com 账户:admin 密码:admin ...
- 【CodeBase】PHP转换编码,读写文件/网页内容的防乱码方法
核心代码: //检查字符串的编码 $charset=mb_detect_encoding($doc,['ASCII','GB2312','GBK','BIG5','UTF8'],TRUE); //字符 ...
- 3分钟快速了解FastDFS
1.介绍 FastDFS是一个C语言写的阿里开源的分布式文件存储服务器主要由两部分组成:1.Tracker server ——————主要负责调度和追踪Storage状态(调度服务器),默认监听端口: ...
- 《鸟哥的Linux私房菜》学习笔记(0)——磁盘与文件系统管理
一.Linux的登陆流程 login: 用户名:每个用户名都有一个用户ID(用户标识符),计算机处理的就是用户ID(数字)而不是用户名(字符),. 认证机制:Authentication,比如密码或者 ...
- 推荐Android几个优质的完整项目学习
==>来自于微信公众号==鸿洋.大家可以关注一波大神之作. 后台经常有人问我能不能推荐几个完整项目用于学习.借着周末的机会,给大家推荐几个,项目我基本都在本地运行过,并且会在文章末尾提供每个项目 ...
- 1568: [JSOI2008]Blue Mary开公司(超哥线段树)
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1198 Solved: 418 Descr ...
- Redis实现之对象(四)
类型检查与命令多态 Redis中用于操作键的命令基本上可以分为两种类型:其中一种命令可以对任何类型的键执行,比如DEL命令.EXPIRE命令.RENAME命令.TYPE命令.OBJECT命令等.举个栗 ...