bzoj3261最大异或和
Posted zcysky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj3261最大异或和相关的知识,希望对你有一定的参考价值。
就是一个可持久化Trie.......
#include<bits/stdc++.h> #define N 600005 using namespace std; inline int read(){ int f=1,x=0;char ch; do{ch=getchar();if(ch==‘-‘)f=-1;}while(ch<‘0‘||ch>‘9‘); do{x=x*10+ch-‘0‘;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘); return f*x; } int bin[30],n,m,a[N],b[N],rt[N]; struct Trie{ int cnt,c[N*24][2],sum[N*24]; int ins(int x,int val){ int tmp,y;tmp=y=++cnt; for(int i=23;i>=0;i--){ c[y][0]=c[x][0];c[y][1]=c[x][1]; sum[y]=sum[x]+1; int t=val&bin[i];t>>=i; x=c[x][t];c[y][t]=++cnt;y=c[y][t]; } sum[y]=sum[x]+1; return tmp; } int query(int l,int r,int val){ int tmp=0; for(int i=23;i>=0;i--){ int t=val&bin[i];t>>=i; if(sum[c[r][t^1]]-sum[c[l][t^1]]) tmp+=bin[i],r=c[r][t^1],l=c[l][t^1]; else r=c[r][t],l=c[l][t]; } return tmp; } }T; int main(){ bin[0]=1;for(int i=1;i<=30;i++)bin[i]=bin[i-1]<<1; n=read();m=read();n++; for(int i=2;i<=n;i++)a[i]=read(); for(int i=1;i<=n;i++)b[i]=b[i-1]^a[i]; for(int i=1;i<=n;i++)rt[i]=T.ins(rt[i-1],b[i]); char s[10];int l,r,x; while(m--){ scanf("%s",s); if(s[0]==‘A‘){ n++;a[n]=read();b[n]=b[n-1]^a[n]; rt[n]=T.ins(rt[n-1],b[n]); } else{ l=read();r=read();x=read(); printf("%d\n",T.query(rt[l-1],rt[r],b[n]^x)); } } }
以上是关于bzoj3261最大异或和的主要内容,如果未能解决你的问题,请参考以下文章