BZOJ 2115: [Wc2011] Xor 线性基
这个题的思路非常神啊,感觉不太好理解...
code:
#include <cstdio> #include <algorithm> #include <cstring> #include <string> #define N 100006 #define ll long long using namespace std; namespace IO { void setIO(string s) { string in=s+".in"; string out=s+".out"; freopen(in.c_str(),"r",stdin); // freopen(out.c_str(),"w",stdout); } }; int n,m,edges; int hd[N],to[N<<1],nex[N<<1],vis[N]; ll bin[65],p[65],val[N<<1],sum[N]; void add(int u,int v,ll c) { nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c; } struct Base { ll p[65]; void insert(ll x) { for(int i=61;i>=0;--i) { if(x&bin[i]) { if(p[i]) x^=p[i]; else { p[i]=x; break; } } } } ll query(ll x) { for(int i=61;i>=0;--i) x=max(x,x^p[i]); return x; } }base; void dfs(int x,int ff,ll pre) { sum[x]=pre,vis[x]=1; for(int i=hd[x];i;i=nex[i]) { int y=to[i]; if(vis[y]) { base.insert(sum[x]^sum[y]^val[i]); continue; } dfs(y,x,sum[x]^val[i]); } } int main() { // IO::setIO("input"); int i,j; scanf("%d%d",&n,&m); for(i=0;i<=61;++i) bin[i]=1ll<<i; for(i=1;i<=m;++i) { int x,y; ll z; scanf("%d%d%lld",&x,&y,&z),add(x,y,z),add(y,x,z); } dfs(1,0,0); printf("%lld\n",base.query(sum[n])); return 0; }