同trie,只是维护的字符只有0和1

可以通过每次如果可以选择不同字符则选择不同字符的贪心思想维护最大异或和。多用于解决异或问题。

为什么上面那样操作可以维护最大异或和?因为我们按照从高位往底的顺序,如果当前答案这一位异或得1,其他答案的更高位都不超过当前答案的更高位,且其他答案这一位异或得0,那么当前答案必定是最大的。

举个例子:$3=(011)_2<4=(100)_2$

代码实现:

void ins(int num){
	int p=0;
	for(int i=30;i>=0;--i){
		int c=((num>>i)&1);
		if(!ch[p][c]) ch[p][c]=++tot;
		p=ch[p][c];
	}
}
int find(int num){
	int p=0,ans=0;
	for(int i=30;i>=0;--i){
		int c=((num>>i)&1);
		if(ch[p][c^1]){
			ans+=(1<<i);
			p=ch[p][c^1];
		}else p=ch[p][c];
	}
	return ans;
}

推荐一道类似模板的题目? 最长异或路径https://www.luogu.com.cn/problem/P4551