这道题写了好久好久,写的我都快哭了。。还是因为代码水平太菜,至于TLE的原因就是动态分配太耗时间了。。。改了静态立刻过了
除了TLE就是后向星+字典树,都很简单,应该是没有问题的~
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define maxn 111111
int vis[maxn],tot,res;
int head[maxn],dis[maxn];
int bin[40];
struct node{
int to,l;
int next;
}edge[maxn*4];
struct trie{
trie *next[2];
int num;
}tree[maxn*35];
void add(int a,int b,int l){
edge[tot].to=b;
edge[tot].l=l;
edge[tot].next=head[a];
head[a]=tot++;
}
void dfs(int now){
int i,v;
vis[now]=1;
for(i=head[now];i!=-1;i=edge[i].next){
v=edge[i].to;
if(vis[v]) continue;
dis[v]=dis[now]^edge[i].l;
dfs(v);
}
}
void get(int x){
int i;
for(i=0;i<=31;i++){
bin[31-i]=x&1;
x>>=1;
}
}
int find(trie *root){
int i,index;
trie *p=root;
for(i=0;i<=31;i++){
index=bin[i];
if(p->next[1-index]!=NULL) p=p->next[1-index];
else p=p->next[index];
}
return p->num;
}
void insert(trie *root,int v){
int i,index;
trie *p=root;
for(i=0;i<=31;i++){
index=bin[i];
if(p->next[index]==NULL){
p->next[index]=&tree[res++];
tree[res-1].next[0]=tree[res-1].next[1]=NULL;
}
p=p->next[index];
}
p->num=v;
}
void solve(int n){
int i,k,f;
int maxs=0;
tree[0].next[0]=tree[0].next[1]=NULL;
res=1;
for(i=1;i<=n;i++){
get(dis[i]);
if(i>1){
f=find(&tree[0]);
if((f^dis[i])>maxs) maxs=f^dis[i];
}
insert(&tree[0],dis[i]);
}
printf("%d\n",maxs);
}
int main(){
int n,i;
int u,v,w;
while(~scanf("%d",&n)){
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
tot=dis[1]=0;
for(i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
add(u+1,v+1,w);
add(v+1,u+1,w);
}
dfs(1);
solve(n);
}
}