1. 程式人生 > >【bzoj3261】最大異或和

【bzoj3261】最大異或和

異或 ... urn fin pri bit names -- else

就是一個可持久化Trie.......

#include<bits/stdc++.h>
#define N 600005
using namespace std;
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch==-)f=-1;}while(ch<0||ch>9);
    do{x=x*10+ch-0;ch=getchar();}while(ch>=0&&ch<=9);
    return f*x;
}
int bin[30],n,m,a[N],b[N],rt[N];
struct Trie{ int cnt,c[N*24][2],sum[N*24]; int ins(int x,int val){ int tmp,y;tmp=y=++cnt; for(int i=23;i>=0;i--){ c[y][0]=c[x][0];c[y][1]=c[x][1]; sum[y]=sum[x]+1; int t=val&bin[i];t>>=i; x=c[x][t];c[y][t]=++cnt;y=c[y][t]; } sum[y]
=sum[x]+1; return tmp; } int query(int l,int r,int val){ int tmp=0; for(int i=23;i>=0;i--){ int t=val&bin[i];t>>=i; if(sum[c[r][t^1]]-sum[c[l][t^1]]) tmp+=bin[i],r=c[r][t^1],l=c[l][t^1]; else r=c[r][t],l=c[l][t]; }
return tmp; } }T; int main(){ bin[0]=1;for(int i=1;i<=30;i++)bin[i]=bin[i-1]<<1; n=read();m=read();n++; for(int i=2;i<=n;i++)a[i]=read(); for(int i=1;i<=n;i++)b[i]=b[i-1]^a[i]; for(int i=1;i<=n;i++)rt[i]=T.ins(rt[i-1],b[i]); char s[10];int l,r,x; while(m--){ scanf("%s",s); if(s[0]==A){ n++;a[n]=read();b[n]=b[n-1]^a[n]; rt[n]=T.ins(rt[n-1],b[n]); } else{ l=read();r=read();x=read(); printf("%d\n",T.query(rt[l-1],rt[r],b[n]^x)); } } }

【bzoj3261】最大異或和