[bzoj3261]最大异或和

[bzoj3261]最大异或和


可持久化01trie

注意最后一个节点的sz不能赋值成1,要赋值成lst.sz+1

  • 代码
#include<bits/stdc++.h>
using namespace std;
const int LEN=25,N=6e5+5;

struct trienode{
    int ch[2],endtime;
    int sum;
}t[LEN*N];
int n,m;
int cnt=0,null=0,root[N];
int newnode(){return ++cnt;}
inline void ins(int x,int pst,int id){
    int sum[26];
    for(int i=24;i>=0;i--)
        if((1<<i)&x)sum[24-i]=1;
        else sum[24-i]=0;
    int lst=root[pst],cur=root[id]=newnode();
    for(int i=0;i<=24;i++){
        t[cur].endtime=t[lst].endtime+1;
        t[cur].ch[sum[i]^1]=t[lst].ch[sum[i]^1];
        cur=t[cur].ch[sum[i]]=newnode(),lst=t[lst].ch[sum[i]];
    }
    t[cur].endtime=t[lst].endtime+1,t[cur].sum=x;
}
inline int qry(int l,int r,int xorsum){
    int sum[26];
    for(int i=24;i>=0;i--)
        if((1<<i)&xorsum)sum[24-i]=1;
        else sum[24-i]=0;
    int cur=root[r],pst=root[l-1];
    for(int i=0;i<=24;i++){
        if( t[t[cur].ch[sum[i]^1]].endtime - t[t[pst].ch[sum[i]^1]].endtime > 0)
            cur=t[cur].ch[sum[i]^1],pst=t[pst].ch[sum[i]^1];
        else 
            cur=t[cur].ch[sum[i]],pst=t[pst].ch[sum[i]];
    }
    return t[cur].sum^xorsum;
}
char getopt(){
    char x=0;while(x<'A'||x>'Z')x=getchar();
    return x;
}
int tot=0,top=0;
int main()
{
    scanf("%d%d",&n,&m);
    for(int x,i=1;i<=n;i++){
        scanf("%d",&x);
        tot^=x,++top;
        ins(tot,top-1,top);
    }
    for(int i=1;i<=m;i++){
        char opt=getopt();
        int l,r,x;
        if(opt=='A'){
            scanf("%d",&x);
            tot^=x,top++;
            ins(tot,top-1,top);
        }
        if(opt=='Q'){
            scanf("%d%d%d",&l,&r,&x);
            int ans=0;
            if(r>1)ans=qry(max(l-1,1),r-1,x^tot);
            if(l==1)ans=max(ans,x^tot);
            printf("%d\n",ans);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值