【BZOJ3261】最大异或和(可持久化Trie)

题意:

 

 

 

 思路:可持久化Trie板子题,支持序列插入和询问

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 typedef unsigned int uint;
  5 typedef unsigned long long ull;
  6 typedef long double ld;
  7 typedef pair<int,int> PII;
  8 typedef pair<ll,ll> Pll;
  9 typedef vector<int> VI;
 10 typedef vector<PII> VII;
 11 typedef pair<ll,ll>P;
 12 #define N  12000010
 13 #define M  6000010
 14 #define INF 1e9
 15 #define fi first
 16 #define se second
 17 #define MP make_pair
 18 #define pb push_back
 19 #define pi acos(-1)
 20 #define mem(a,b) memset(a,b,sizeof(a))
 21 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
 22 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
 23 #define lowbit(x) x&(-x)
 24 #define Rand (rand()*(1<<16)+rand())
 25 #define id(x) ((x)<=B?(x):m-n/(x)+1)
 26 #define ls p<<1
 27 #define rs p<<1|1
 28 #define fors(i) for(auto i:e[x]) if(i!=p)
 29 
 30 const int MOD=1e8+7,inv2=(MOD+1)/2;
 31       int p=1e4+7;
 32       double eps=1e-8;
 33       int dx[4]={-1,1,0,0};
 34       int dy[4]={0,0,-1,1};
 35 
 36 char ch[10];
 37 int t[N][2],s[N],root[N],b[N],cnt;
 38 
 39 int read()
 40 {
 41    int v=0,f=1;
 42    char c=getchar();
 43    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
 44    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 45    return v*f;
 46 }
 47 
 48 ll readll()
 49 {
 50    ll v=0,f=1;
 51    char c=getchar();
 52    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
 53    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 54    return v*f;
 55 }
 56 
 57 void ins(int p1,int &p2,int z,int d)
 58 {
 59     int p=(z>>d)&1;
 60     p2=++cnt;
 61     s[p2]=s[p1]+1;
 62     if(d<0) return;
 63     t[p2][p^1]=t[p1][p^1];
 64     ins(t[p1][p],t[p2][p],z,d-1);
 65 }
 66 
 67 int query(int p1,int p2,int z,int d)
 68 {
 69     if(d<0) return 0;
 70     int p=(z>>d)&1;
 71     if(s[t[p2][p^1]]-s[t[p1][p^1]]) return (1<<d)+query(t[p1][p^1],t[p2][p^1],z,d-1);
 72      else return query(t[p1][p],t[p2][p],z,d-1);
 73 }
 74 
 75 int main()
 76 {
 77     //freopen("1.in","r",stdin);
 78     //freopen("1.out","w",stdout);
 79     cnt=0;
 80     ins(0,root[1],0,24);
 81     int n=read(),m=read();
 82     n++;
 83     rep(i,2,n)
 84     {
 85         int x=read();
 86         b[i]=b[i-1]^x;
 87         ins(root[i-1],root[i],b[i],24);
 88     }
 89     while(m--)
 90     {
 91         scanf("%s",ch);
 92         if(ch[0]=='A')
 93         {
 94             int x=read();
 95             n++;
 96             b[n]=b[n-1]^x;
 97             ins(root[n-1],root[n],b[n],24);
 98         }
 99          else
100          {
101              int l=read(),r=read(),x=read();
102              int ans=query(root[l-1],root[r],b[n]^x,24);
103              printf("%d\n",ans);
104          }
105     }
106 
107     return 0;
108 }

 

posted on 2019-11-18 17:11  myx12345  阅读(112)  评论(0编辑  收藏  举报

导航