首页 > 其他分享 >01trie

01trie

时间:2024-02-16 18:33:21浏览次数:23  
标签:xorv int 01trie dep 异或 trie pushup

01trie

定义

01-trie是字符集为0,1的trie,可以维护异或极值,维护异或和

实现

主体仍然是 trie ,维持 \(t\) 数组记录儿子不变。需要因为异或的性质,所以只需要维护加入 0/1 边的奇偶性即可,所以添加 \(w\) 数组记录父节点到该节点的边数。此外因为要统计异或和,所以要在树上统计,用 \(xorv\) 数组记录。本来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是解决该问题的一种方法,把数字转换成字串是关键一步,随后对于 \(w,xorv\) 数组的维护需要注意细节。最具有技巧性的是全局加一,要对于位运算有深刻的理解。最后,要注意线段树,trie与0/1trie的关系,同为高级数据结构,互相有相同之处。作为OI选手要对其融会贯通。

习题巩固

[省选联考 2020 A 卷] 树 Luogu [省选联考 2020 A 卷] 树 Uoj 提示 0/1trie合并,全局加一

最长异或路径 提示 0/1trie维护极值,贪心

标签:xorv,int,01trie,dep,异或,trie,pushup
From: https://www.cnblogs.com/life-of-a-libertine/p/18017374

相关文章

  • [模板]01trie,维护异或最大值
    //查询异或最大值,每次插入和查询时间都是log(C)template<classT>classtrie01{vector<vector<T>>tree;public:trie01():tree(1,vector<T>(2,0)){}//插入待检查的数字voidinsert(Tx){intp=0;for(inti=sizeof......
  • 01trie树相关
    01-trie是指字符集为\(\{0,1\}\)的trie。01-trie可以用来维护一些数字的异或和,支持修改(删除+重新插入),和全局加一(即:让其所维护所有数值递增\(1\),本质上是一种特殊的......
  • 字符串练习2 最长抑或路径(01trie树)
    题目链接在这里:​​P4551最长异或路径-洛谷|计算机科学教育新生态(luogu.com.cn)​​是一道比较经典的问题,对于异或问题经常会使用01trie树来解决。当然01trie树只是......
  • 字符串练习2 最长抑或路径(01trie树)
    题目链接在这里:P4551最长异或路径-洛谷|计算机科学教育新生态(luogu.com.cn)是一道比较经典的问题,对于异或问题经常会使用01trie树来解决。当然01trie树只是用来统......
  • 【XSY4184】谁(who)(01Trie,结论)
    考虑哪些点对无论颜色怎么变都是没有用的(不可能成为答案)。先把01Trie建出来,对于每一个点\(lca\),找到异或值最小的两个点\(u,v\),使得\(u\)在\(lca\)左子树内,\(v\)......
  • 【CF888G】Xor-MST(01Trie,最小生成树)
    看到异或最值要么是线性基要么是01Trie。线性基显然可以排除。那么先把所有的\(a_i\)插入01Trie内。然后发现对于任意两个数\(a_i\)和\(a_j\):你发现它们在\(......
  • CF815 D2 Xor-Subsequence (hard version)(01trie)
    传送门sb题面误导了我半天。按位考虑,对于\(a[i]\)和\(i\)的一位考虑什么样的\(a[j]\)和\(j\)可以转移过来,发现这一位有一种一定可以一种一定不行,还有两种不确定。考虑......