利用线性基的合并,(直接暴力合并,复杂度62^2),当树上路径和来做。。。(然后跑的巨慢,但是可以优化哈哈)
#includeusing namespace std;const int N=2e4+7;struct XianXingJi { long long base[64]; inline bool insert(long long vec) { for(int i=62; ~i; --i) { if(!(vec>>i)) continue; if(!base[i]) {base[i]=vec; return 1;} vec^=base[i]; } return 0; } inline XianXingJi add(const XianXingJi& d) { XianXingJi res=*this; for(int i=62; ~i; --i) { if(d.base[i]) res.insert(d.base[i]); } return res; } inline long long max() { long long res=0; for(int i=62; ~i; --i) { if((res^base[i])>res) res^=base[i]; } return res; }} dis[N][20];int n,m;int fa[N][20],dep[N];vector e[N];void pre(int x,int pa) { dep[x]=dep[fa[x][0]=pa]+1; for(int i=1; (1< <=dep[x]; ++i) { fa[x][i]=fa[fa[x][i-1]][i-1]; dis[x][i]=dis[x][i-1].add(dis[fa[x][i-1]][i-1]); } for(int y:e[x]) if(y!=pa) { pre(y,x); }}long long query(int x,int y) { XianXingJi res; memset(&res,0,sizeof res); if(dep[x]