bzoj 3261: 最大异或和

可持久化trie模板。。。。

错误记录:

没有在第0棵树中插入0,WA;

此题没有保证l,r合法,所以应该最好要判一下的。。。。并且按我这个写,是要访问到-1元素下标的树的(这个是真正的空树,0都没有),要所有下标+1才对(然而没有改也A掉了?)

改的时候要小心再小心。。。。(因此WA了无数发)

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 namespace Trie
 5 {
 6 const int l2n=24;
 7 int lft[40];
 8 int sz[16000100],ch[16000100][2];
 9 int x,mem;
10 void init()
11 {
12     int i;lft[0]=1;
13     for(i=1;i<=l2n;i++)  lft[i]=lft[i-1]<<1;
14 }
15 inline void cp(int &num)
16 {
17     int t=num;num=++mem;sz[num]=sz[t];ch[num][0]=ch[t][0];ch[num][1]=ch[t][1];
18 }
19 void _ins(int p,int &num)
20 {
21     cp(num);sz[num]++;
22     if(p>=0)    _ins(p-1,ch[num][!!(x&lft[p])]);
23 }
24 void ins(int d,int &num)    {x=d;_ins(l2n-1,num);}
25 int que(int x,int r1,int r2)
26 {
27     int ans=0,i;bool t;
28     for(i=l2n-1;i>=0;i--)
29     {
30         t=x&lft[i];
31         if(sz[ch[r2][!t]]-sz[ch[r1][!t]])   ans|=lft[i],r2=ch[r2][!t],r1=ch[r1][!t];
32         else    r2=ch[r2][t],r1=ch[r1][t];
33     }
34     return ans;
35 }
36 }
37 using Trie::ins;using Trie::que;
38 //找到一个位置l<=p<=r,使得sum[p-1]^(sum[N]^x)最大
39 int rt[600100];
40 char tmp[10];
41 int n,m,a[600100];
42 int main()
43 {
44     int i,l,r,x;
45     Trie::init();
46     scanf("%d%d",&n,&m);
47     ins(0,rt[1]);
48     for(i=1;i<=n;i++)
49     {
50         scanf("%d",&a[i]);a[i]^=a[i-1];
51         rt[i+1]=rt[i];ins(a[i],rt[i+1]);
52     }
53     while(m--)
54     {
55         scanf("%s",tmp);
56         if(tmp[0]=='A')
57         {
58             scanf("%d",&a[++n]);a[n]^=a[n-1];
59             rt[n+1]=rt[n];ins(a[n],rt[n+1]);
60         }
61         else if(tmp[0]=='Q')
62         {
63             scanf("%d%d%d",&l,&r,&x);l=max(l,1);r=min(r,n);
64             printf("%d
",que(a[n]^x,rt[l-1],rt[r]));
65         }
66     }
67     return 0;
68 }
原文地址:https://www.cnblogs.com/hehe54321/p/9014909.html