标签:
一开始以为是点权然后一直不会写QAQ
读完题发现是边权...
u到v的路径异或和=根到u的路径异或和 异或 根到v的路径异或和
拿个trie或者是线段树记录一下就好了
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define ll long long 6 using namespace std; 7 const int maxn=100233; 8 struct zs{int too,pre,dis;}e[maxn<<1];int tot,last[maxn]; 9 int a[maxn],val[maxn]; 10 int ch[maxn*32][2],tt; 11 int i,j,k,n,m,ans; 12 bool s[33]; 13 14 int ra;char rx; 15 inline int read(){ 16 rx=getchar(),ra=0; 17 while(rx<‘0‘||rx>‘9‘)rx=getchar(); 18 while(rx>=‘0‘&&rx<=‘9‘)ra*=10,ra+=rx-48,rx=getchar();return ra; 19 } 20 void dfs(int x,int fa){ 21 for(int i=last[x];i;i=e[i].pre)if(e[i].too!=fa) 22 val[e[i].too]=val[x]^e[i].dis,dfs(e[i].too,x); 23 } 24 inline void insert(int a,int b,int c){ 25 e[++tot].too=b,e[tot].dis=c,e[tot].pre=last[a],last[a]=tot, 26 e[++tot].too=a,e[tot].dis=c,e[tot].pre=last[b],last[b]=tot; 27 } 28 void ins(int v){ 29 int i,now=0; 30 for(i=30;i>=0;i--)s[30-i]=(v&(1<<i))>0; 31 for(i=0;i<=30;i++){ 32 if(!ch[now][s[i]])ch[now][s[i]]=++tt,now=tt; 33 else now=ch[now][s[i]]; 34 } 35 } 36 int query(int v){ 37 int i,now=0,ans=0; 38 for(i=30;i>=0;i--)s[30-i]=(v&(1<<i))>0; 39 for(i=0;i<=30;i++) 40 if(ch[now][s[i]^1])now=ch[now][s[i]^1],ans|=1<<(30-i); 41 else now=ch[now][s[i]]; 42 return ans; 43 } 44 int main(){ 45 n=read(); 46 for(i=1;i<n;i++)j=read(),k=read(),insert(j,k,read()); 47 dfs(1,0); 48 for(i=1;i<=n;i++)ans=max(ans,query(val[i])),ins(val[i]); 49 printf("%d\n",ans); 50 }
[bzoj1954] Pku3764 The xor-longest Path
标签:
原文地址:http://www.cnblogs.com/czllgzmzl/p/5596357.html