BZOJ 3261: 最大异或和 可持久化trie

模板题,刷点数据结构 ~ 

code: 

#include <bits/stdc++.h> 
#define N 600009   
#define setIO(s) freopen(s".in","r",stdin)    
using namespace std;    
int rt[N],sum[N],tot;   
struct node 
{ 
    int ch[2],cnt;   
}t[N*28];     
void insert(int a,int b,int len,int num) 
{ 
    if(len<0)  return; 
    int o=(num>>len)&1;        
    t[b].ch[o^1]=t[a].ch[o^1];         
    t[b].ch[o]=++tot;   
    t[t[b].ch[o]].cnt=t[t[a].ch[o]].cnt+1;             
    insert(t[a].ch[o],t[b].ch[o],len-1,num);                          
}
int query(int l,int r,int len,int x) 
{
    if(len<0) return 0;               
    int o=(x>>len)&1;               
    if(t[t[r].ch[o^1]].cnt>t[t[l].ch[o^1]].cnt) 
    {          
        return (1<<len)+query(t[l].ch[o^1],t[r].ch[o^1],len-1,x);      
    }
    else 
    {
        return query(t[l].ch[o],t[r].ch[o],len-1,x);       
    }      
}
int main() 
{
    // setIO("input");    
    int i,j,n,m;   
    scanf("%d%d",&n,&m); 
    rt[0]=++tot;        
    insert(0,rt[0],25,0);                                       
    for(i=1;i<=n;++i) 
    {   
        int x;       
        scanf("%d",&x);     
        sum[i]=sum[i-1]^x;  
        rt[i]=++tot;                   
        insert(rt[i-1],rt[i],25,sum[i]);          
    }
    for(i=1;i<=m;++i) 
    {             
        char str[10]; 
        scanf("%s",str);   
        if(str[0]=='A') 
        {   
            int b; 
            scanf("%d",&b); 
            ++n; 
            sum[n]=sum[n-1]^b;      
            rt[n]=++tot; 
            insert(rt[n-1],rt[n],25,sum[n]);             
        } 
        else 
        { 
            int x,y,z; 
            scanf("%d%d%d",&x,&y,&z);     
            --x,--y;                                
            if(x==0)    printf("%d\n",query(0,rt[y],25,z^sum[n]));   
            else printf("%d\n",query(rt[x-1],rt[y],25,z^sum[n]));   
        }
    }
    return 0; 
}

  

posted @ 2019-11-26 07:51  EM-LGH  阅读(148)  评论(0编辑  收藏  举报