题目 POJ3764 The xor-longest Path

[原题传送门](http://poj.org/problem?id=3764)

主要思路:

1.求出每个点到根节点(这里是树,所以直接取0)路径上所有权值xor和为d[i],则任意两点间路径xor和则为 d[x]^d[y](至于证明,~~作者太懒,不想写~~)

2.接着用trie树跑出 max(d[x]^d[y]) (0<=x<n && 0<=y<n)

Code

#include<cstdio>
#include<cstring>
//#include<windows.h>
using namespace std;
#define rg register int
#define I inline int
#define V inline void
#define ll long long
#define db double
#define B inline bool
#define F1(i,a,b) for(rg i=a;i<=b;++i)
#define F2(i,a,b) for(rg i=a;i>=b;--i)
#define ed putchar('\n')
#define bl putchar(' ')
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
//#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
//char buf[1<<21],*p1=buf,*p2=buf;
const int N=100005;
template<typename TP>V read(TP &x)
{
TP f=1;x=0;register char c=getchar();
for(;c<'0'||c>'9';c=getchar()) if(c=='-') f=-1;
for(;c>='0'&&c<='9';c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
x*=f;
}
template<typename TP>V print(TP x)
{
if(x<0) x=-x,putchar('-');
if(x>9) print(x/10);
putchar(x%10+'0');
}
int n,a,b,c,ans,cnt=1,t[N<<5][2];
struct node{
int v,w,nxt;
}e[N<<1];
int tot,h[N],d[N];
template<typename TP>V add(TP u,TP v,TP w)
{
e[++tot].v=v;
e[tot].w=w;
e[tot].nxt=h[u];
h[u]=tot;
}
template<typename TP>V dfs(TP x,TP fa)
{
// print(d[x]),system("pause"),ed;
for(TP i=h[x];i;i=e[i].nxt)
{
TP v=e[i].v,w=e[i].w;
if(v==fa) continue;
d[v]=d[x]^w;
dfs(v,x);
}
}
struct T{
template<typename TP>V insert(TP val)
{
TP rt=1;
F2(i,30,0)
{
TP id=val>>i&1;
if(!t[rt][id]) t[rt][id]=++cnt;
rt=t[rt][id];
}
}
template<typename TP>I search(TP val)
{
TP rt=1,sum=0;
F2(i,30,0)
{
TP id=val>>i&1;
if(t[rt][id^1]) rt=t[rt][id^1],sum|=1<<i;
else rt=t[rt][id];
}
return sum;
}
}trie;
V init()
{
ans=tot=0,cnt=1;
memset(h,0,sizeof h);
memset(t,0,sizeof t);
}
int main()
{
while(~scanf("%d",&n))
{
init();
F1(i,1,n-1)
{
read(a),read(b),read(c);
add(a,b,c),add(b,a,c);
}
d[0]=0,dfs(0,-1);
F1(i,0,n-1)
{
trie.insert(d[i]);
ans=Max(ans,trie.search(d[i]));
}
print(ans),ed;
// F1(i,0,n-1) print(d[i]),bl;
}
return 0;
}

最新文章

  1. 3D游戏中的画质与效率适配
  2. linux下tomcat安全配置
  3. HotApp小程序统计之如何接入
  4. 关于php的开源
  5. Java String字符串补0或空格
  6. Java学习笔记14--动态代理
  7. FactoryBean的使用
  8. 判断远程图片是否存在【适用于windows服务器】
  9. Cocos2d-JS中JavaScript继承
  10. 基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏
  11. HDU2196 - Computer(树形DP)
  12. HW4.31
  13. Windows 7 taskbar and startmenu pin
  14. C#输出日历
  15. 使用VMware Converter Standalone Client进行虚拟机 P2V提示 权限不足,无法连接\\ip\admin$的解决方法集锦
  16. 『字符串模式匹配 KMP』
  17. 使用boost.python封装C++库
  18. phpcms中content主要使用的详情列表关系
  19. 安卓开发学习之AutoCompleteTextView
  20. 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)

热门文章

  1. 作业1:java虚拟机内存模型图示
  2. React-脚手架
  3. .NET Core 创建Windows服务
  4. Matlab函数kmeans
  5. jstl的forEach 循环
  6. EasyUI中的重要的控件和属性
  7. 行级安全(Row
  8. 了解jQuery的detach()和remove()
  9. vue-element-admin 之改变登录界面input的光标颜色
  10. Hadoop_32_HDFS高可用机制