可持久化trie

可持久化trie树

https://www.luogu.org/problem/P4735

题目描述

给定一个非负整数序列{a},初始长度为N。

有M个操作,有以下两种操作类型:

  1. A x:添加操作,表示在序列末尾添加一个数x,序列的长度N+1。

  2. Q l r x:询问操作,你需要找到一个位置p,满足l≤p≤r,使得:a[p]⊕a[p+1]⊕...⊕a[N]⊕x最大,输出最大是多少。

    solution

    异或满足可减性,所以可以维护前缀和

    添加操作就方便了

    就是询问操作不太好处理

    // luogu-judger-enable-o2
    #include 
    using namespace std;
    #define maxn 600009
    int rt[maxn],cnt[maxn*28];
    int ch[maxn*28][2];
    int qz[maxn];
    int tt=1;
    int n,m;
    void ins(int a,int b,int t,int x) {
        if(t<0) return;
        int i=(x>>t)&1;
        ch[a][!i]=ch[b][!i];
        ch[a][i]=tt++;
        cnt[ch[a][i]]=cnt[ch[b][i]]+1;
        ins(ch[a][i],ch[b][i],t-1,x);
    }
    int qu(int a,int b,int t,int x) {
        if(t<0) return 0;
        int i=(x>>t)&1;
        if(cnt[ch[b][!i]]>cnt[ch[a][!i]]) {
            return (1<

    还有一种非递归版的:

    // luogu-judger-enable-o2
    #include 
    #include 
    #include 
    using namespace std;
    int n,m,trie[20000000][2],root[20000000],size[20000000],node_cnt,node;
    inline int read()
    {
     int X(0),w(0);char ch(0);
     while (!isdigit(ch))w|=ch=='-',ch=getchar();
     while (isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
     return w?-X:X;
    }
    inline void write(int x)
    {
     if (x<0) putchar('-'),x=-x;
     if (x>9) write(x/10);
     putchar(x%10+'0');
    }
    int getc()
    {
     char ch=getchar();
     while(ch<'A'||ch>'Z')ch=getchar();
     return ch=='A';
    }
    void insert(int x)
    {   
     int rt=root[node_cnt];
     root[++node_cnt]=++node;
     for (register int i=24;i>=0;i--)
     {
         int ch=(x>>i)&1;
         size[node]=size[rt]+1;
         trie[node][ch]=node+1;
         trie[node][!ch]=trie[rt][!ch];
         rt=trie[rt][ch];
         node++;
     }
     size[node]=size[rt]+1;
    }
    void query(int l,int r,int x)
    {
     int lc=root[l],rc=root[r],ans=0;
     for (register int i=24;i>=0;i--)
     {
         int ch=(x>>i)&1;
         if (size[trie[rc][!ch]]-size[trie[lc][!ch]]>0)
             lc=trie[lc][!ch],rc=trie[rc][!ch],ans|=1<

你可能感兴趣的:(可持久化trie)