01trie
01trie
定义
01-trie是字符集为0,1的trie,可以维护异或极值,维护异或和
实现
主体仍然是 trie ,维持
关于细节:
记录MAXH为0/1串长度,强制将所有串变为MAXH长度
值的修改(pushup)
void pushup(int x){
w[x] = xorv[x] = 0;
if(t[x][0]){
w[x] += w[t[x][0]];
xorv[x] ^= xorv[t[x][0]]<<1;
}
if(t[x][1]){
w[x] += w[t[x][1]];
xorv[x] ^= (xorv[t[x][1]]<<1) | (w[t[x][1]]&1);
}
w[x] &= 1;
}
插入&删除
从低到高加入位
void insert(int &x,int v,int dep){
if(!x)x=mknode();
if(dep==MAXH)w[x]++;
else{
insert(t[x][v&1],v>>1,dep+1);
pushup(x);
}
}
void erase(int x, int v, int dep) {
if(dep==MAXH)w[x]--;
else{
erase(ch[x][x&1],x>>1,dep+1);
pushup(x);
}
}
全局加一
二进制加一就是指找到从低到高的第一个0,把他置为1,把这个1前面的所有1置为0
100000111+1=100001000
void addall(int x){
swap(t[x][0],t[x][1]);
if(t[x][0])addall(t[x][0]);
pushup(x);
}
01trie 合并
类似线段树合并
int merge(int a,int b){
if(!a)return b;
if(!b)return a;
w[a] += w[b];
xorv[a] ^= xorv[b];
t[a][0] = merge(t[a][0],t[b][0]);
t[a][1] = merge(t[a][1],t[b][1]);
return a;
}
思想总结
对于异或和问题,要使用位运算按位解决(傻子都知道)。0/1trie是解决该问题的一种方法,把数字转换成字串是关键一步,随后对于
习题巩固
[省选联考 2020 A 卷] 树 Luogu [省选联考 2020 A 卷] 树 Uoj 提示 0/1trie合并,全局加一
最长异或路径 提示 0/1trie维护极值,贪心
本文作者:⅔钱强
本文链接:https://www.cnblogs.com/life-of-a-libertine/p/18017374
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类