最大异或和
可持久化Trie的入门题。
直接粘代码:
#include<cstdio> #define N 600005 int n,m; int a[N],b[2*N],rt[N]; char ch[5]; struct Trie { int cnt; int ch[30*N][2]; int sum[30*N]; int insert(int x,int val) { int tmp,y; tmp = y = ++cnt; for(int i=23;i>=0;i--) { ch[y][0]=ch[x][0];ch[y][1]=ch[x][1]; sum[y]=sum[x]+1; int k = ((val&(1<<i))!=0); x = ch[x][k]; ch[y][k]=++cnt; y=ch[y][k]; } sum[y]=sum[x]+1; return tmp; } int query(int l,int r,int val) { int ret = 0; for(int i=23;i>=0;i--) { int t = ((val&(1<<i))!=0); if(sum[ch[r][t^1]]-sum[ch[l][t^1]]) { ret|=(1<<i); l = ch[l][t^1]; r = ch[r][t^1]; }else { l = ch[l][t]; r = ch[r][t]; } } return ret; } }trie; int main() { scanf("%d%d",&n,&m); n++; rt[1]=trie.insert(rt[1],0); for(int i=2;i<=n;i++) { scanf("%d",&a[i]); b[i]=b[i-1]^a[i]; rt[i]=trie.insert(rt[i-1],b[i]); } for(int l,r,x,i=1;i<=m;i++) { scanf("%s",ch+1); if(ch[1]=='A') { scanf("%d",&x); b[n+1]=b[n]^x; n++; rt[n]=trie.insert(rt[n-1],b[n]); }else { scanf("%d%d%d",&l,&r,&x); printf("%d\n",trie.query(rt[l-1],rt[r],b[n]^x)); } } return 0; }