可持久化01Trie
完全等于可持久化动态开点线段树。 例题: Luogu P4735 最大异或和 建可持久化01Trie。 每次建一个新版本把序列的每个前缀和插进去。 添加操作亦如此。 查询的话就看每个数位取反的一侧在01Trie的这个区间内是否出现过(也就是 \(sum\) 是否相等),然后跳儿子。 #include<bits/stdc++.h> using namespace std; const int N=3e7; int read(){int x=0;char c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))x=x*10+c-48,c=getchar();return x;} int n,m,cnt,root[N],son[N][2],d[31],sum[N];char s[3]; int Get(){scanf("%s",s);return s[0]=='A';} void split(int p) { int i,len=0; for(;p;d[++len]=p&1,p>>=1); for(i=len+1;i<=30;++i) d[i]=0; } void update(int &p,int pre) { sum[p=++cnt]=sum[pre]+1; for(int i=30,t=p;i;--i) son[t][d