首页 > 代码库 > 【bzoj3261】最大异或和
【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】最大异或和
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。