蒟蒻求助

P4735 最大异或和

@[华恋_韵](/user/173510) 你能给自己的数组注释一下吗? 这样直接给代码 一般没人看(QAQ)
by 鬼·烨弑 @ 2020-06-18 16:21:58


```cpp #include<bits/stdc++.h> using namespace std; const int N=6e5+10; int n,m,r; int a[3*N]; struct node{ int ch[2]; int num; }t[N*40]; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } struct tree{ int root[N]; int cnt; tree(){ memset(root,0,sizeof root); cnt=0; } int clone(int p) { ++cnt; t[cnt]=t[p]; return cnt; } int add(int p,int x ,int d) { p=clone(p); t[p].num++; if(d==-1)return p; bool k=(x>>d)&1; t[p].ch[k]=add(t[p].ch[k],x,d-1); return p; } int find(int f1,int f2,int x,int d) { if(d==-1)return 0; bool k=(x>>d)&1; int ans=0; if(t[t[f2].ch[!k]].num>t[t[f1].ch[!k]].num)ans+=(1<<d),ans+=find(t[f1].ch[!k],t[f2].ch[!k],x,d-1); else ans+=find(t[f1].ch[k],t[f2].ch[k],x,d-1); return ans; } }T; int main() { n=read(),m=read(); T.root[r] = T.add(0,a[r],25);// !!!!!!!!!!! for(r=1;r<=n;r++) { a[r]=read(); a[r]^=a[r-1]; T.root[r]=T.add(T.root[r-1],a[r],25); } r--; while(m--) { char k[3]; int l,R,x; scanf("%s",k); switch(k[0]) { case 'A':{ ++r; a[r]=read(); a[r]^=a[r-1]; T.root[r]=T.add(T.root[r-1],a[r],25); break; } case 'Q':{ l=read(),R=read(),x=read(); x^=a[r]; if(l==1)printf("%d\n",T.find(0,T.root[R-1],x,25)); // !!!!!! T.root[0] --> 0 else printf("%d\n",T.find(T.root[l-2],T.root[R-1],x,25)); break; } } } return 0; } ```
by 鬼·烨弑 @ 2020-06-18 16:53:40


谢谢大佬Orz
by 华恋_韵 @ 2020-06-18 16:57:13


|