可持久化Trie

挺可持久化的实现过程

#include<bits/stdc++.h>
#define int long long
#define F(i,i0,n) for(int i=i0;i<=n;i++)
using namespace std;
inline int rd(){
    int f=0,x=0;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
    return f?-x:x;
}
const int N=2e7+5,inf=1e9;
int n,m;
struct Trie{
    int ch[N][2],val[N],rt[N],tot,cnt[N],num;
    void ins(int x){
        rt[++num]=++tot;val[num]=x;
        int l=rt[num-1],r=rt[num];
        for(int i=30;~i;--i){
            int k=(x>>i)&1;
            ch[r][k^1]=ch[l][k^1];
            ch[r][k]=++tot;
            l=ch[l][k],r=ch[r][k];
            cnt[r]=cnt[l]+1;
        }
    }
    int que(int o1,int o2,int x){
        int ans=0;
        o1=rt[o1],o2=rt[o2];
        for(int i=30;~i;--i){
            int k=(x>>i)&1;
            if(cnt[ch[o1][k^1]]-cnt[ch[o2][k^1]]){//这个是是否存在真实的节点
                ans+=(1<<i);
                o1=ch[o1][k^1];
                o2=ch[o2][k^1];
            }
            else {
                o1=ch[o1][k];
                o2=ch[o2][k];
            }
        }
        return ans;
    }
}trie;
signed main(){
    n=rd(),m=rd();
    trie.ins(0);
    int sum=0;
    F(i,1,n){
        int x=rd();
        trie.ins(sum^=x);
    }
    while(m--){
        char op;cin>>op;
        if(op=='A'){
            int x=rd();
            trie.ins(sum^=x);
        }
        else {
            int l=rd(),r=rd(),x=rd();
            cout<<trie.que(r,l-1,sum^x)<<'\n';
        }
    }
    return 0;
}
posted @   ussumer  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示