trie合并,加sg函数。。。
这道题体现了dp思想处理博弈论问题,同时发现许多的书上信息合并问题可以考虑线段树合并。
也体现了,trie处理xor问题,也体现了trie处理mex问题。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<stack>
using namespace std;
const int N=100005;
const int D=19;int n;
int c[N];int head[N],tot,pre[N*2],to[N*2];
void addedge(int u,int v){to[++tot]=v;pre[tot]=head[u];head[u]=tot;}
int dp[N];
int num,rt[N],ch[N*41][2],rev[N*41],val[N*41];
void build(int &u,int tmp,int D)
{if (u==0) u=++num;if (D==-1) {val[u]=1;return ;}build(ch[u][tmp>>D&1],tmp,D-1);
}
void down(int u,int D)
{rev[ch[u][0]]^=rev[u];rev[ch[u][1]]^=rev[u];if (rev[u]&(1<<D)) swap(ch[u][0],ch[u][1]);rev[u]=0;
}
int merge(int u,int v,int D)
{if (!u||!v)