最大异或和
太恶心了!!!
这道题疯狂卡时,特别是第六个点
而且,数据也特别丧心病狂 第二个点 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); } } }