最大异或和

题目

太恶心了!!!

这道题疯狂卡时,特别是第六个点

而且,数据也特别丧心病狂 第二个点 Q 1 1 x


就是个可持久化01trie

再加点异或

设s[p]为从1到p的xor值

则a[p],a[p+1]……a[n]=s[p-1]^s[n]

所以将所有s[]存下来,放到可持久化01trie里查找就好

代码

//%%%what is persistent trie ?
#include<bits/stdc++.h>
#define re return
#define R  register 
#define ll long long
#define dec(i,l,r) for(register int i=l;i>=r;--i)
#define inc(i,l,r) for(register int i=l;i<=r;++i)

using namespace std;
template<typename T>inline void rd(T&x)
{
    char c;bool f=0;
    while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
    x=c^48;
    while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
    if(f)x=-x;
}

const int maxn=600005;
int n,m,tot,num,ans;
int tr[maxn*31][2],cnt[maxn*31];
int T[maxn];

inline void modify(R int pre,R int now,R int x,R int i)
{
    if(i==-1)re ;
    int t=x>>i&1; 
    tr[now][!t]=tr[pre][!t];
    tr[now][t]=++tot;
    cnt[tr[now][t]]=cnt[tr[pre][t]]+1;
    modify(tr[pre][t],tr[now][t],x,i-1);
}

inline void query(R int pre,R int now,R int x,R int i)
{
    if(i==-1)re ;
    int t=x>>i&1;
    if(cnt[tr[pre][t^1]]<cnt[tr[now][t^1]])
    {
        ans+=1<<i;
        query(tr[pre][t^1],tr[now][t^1],x,i-1);
    }    
    else query(tr[pre][t],tr[now][t],x,i-1);
    //一边没有,一边有 
}
int main()
{
    int x,y,z;
    freopen("in.txt","r",stdin);
    rd(n);rd(m);
    T[0]=++tot;
    //放止某个丧心病狂的数据找不到0来异或 
    modify(0,T[0],0,23);
    //23注意卡时 
    inc(i,1,n)
    {
        rd(x);
        num^=x;
        T[i]=++tot;
        modify(T[i-1],T[i],num,23);
    }
    
    char opt[5];
    inc(i,1,m)
    {
        scanf("%s",opt);
        if(opt[0]=='A')
        {
            rd(x);
            num^=x;
            ++n;
            T[n]=++tot;
            modify(T[n-1],T[n],num,23);
        }
        else if(opt[0]=='Q')
        {
            ans=0;
            rd(x),rd(y),rd(z);
            if(x==1)
            query(0,T[y-1],num^z,23);//防止越界 
            else query(T[x-2],T[y-1],num^z,23);
            //求x-1到y-1,范围要从x-2到y-1, 
            printf("%d\n",ans);
        }
    }
}

 

posted @ 2019-08-21 08:41  凉如水  阅读(221)  评论(0编辑  收藏  举报