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\n",que(a[n]^x,rt[l-1],rt[r])); 65 } 66 } 67 return 0; 68 }