题解:
考虑到是异或,那么就是位运算
位运算会想到什么?当然是按位拆开
那么就变成了一个个的字符串
考虑了trie
可是貌似有多个问题
那么就用可持久化trie!
代码:
#include<bits/stdc++.h> using namespace std; const int N=50005,M=1550005,L=30; int tot,n,q,son[M][2],sum[M],root[N],bz[L+5]; int read() { int x=0;char c; for (c=getchar();c<'0'||c>'9';c=getchar()); for (;c>='0'&&c<='9';c=getchar())x=x*10+c-48; return x; } void insert(int v,int &x,int y) { x=++tot; memcpy(son[x],son[y],8); sum[x]=sum[y]+1; if (!v) return; insert(v-1,son[x][bz[v-1]],son[y][bz[v-1]]); } int find(int v,int x,int y) { if (!v) return 0; if (sum[son[x][bz[v-1]]]>sum[son[y][bz[v-1]]]) return find(v-1,son[x][bz[v-1]],son[y][bz[v-1]])+(1<<(v-1)); return find(v-1,son[x][1-bz[v-1]],son[y][1-bz[v-1]]); } int main() { n=read();q=read(); for (int i=1;i<=n;i++) { int x=read(); for (int j=0;j<L;x/=2)bz[j++]=x%2; insert(L,root[i],root[i-1]); } while (q--) { int x=read(),l=read(),r=read(); for (int j=0;j<L;x/=2)bz[j++]=1-(x%2); printf("%d ",find(L,root[r+1],root[l])); } }