P4735 最大异或和 可持久化trie树
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define inf 0x3f3f3f3f #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// const int N=2e6+10; int t[N<<5][2],Lmax[N<<5],ncnt,n,m,x,y,z,T[N],s[N]; char ss[2]; void upnode(int k,int i,int pre,int pos) { if(k<0){Lmax[pos]=i;return ;} bool c=(s[i]>>k)&1; if(pre)t[pos][c^1]=t[pre][c^1]; t[pos][c]=++ncnt; upnode(k-1,i,t[pre][c],t[pos][c]); Lmax[pos]=max(Lmax[t[pos][0]],Lmax[t[pos]