可持久化Trie树
Posted wmjlzw1314
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可持久化Trie树相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 600009;
int cnt = 1 , sum[maxn * 28] , ch[maxn * 28][2] , qianzhui[maxn] , T[maxn] , n , m;
void change(int a ,int b , int t ,int x){
if(t < 0)return ;
int i = (x >> t) & 1;
ch[a][!i] = ch[b][!i];//继承上一个全部的内容
ch[a][i] = cnt ++;
sum[ch[a][i]] = sum[ch[b][i]] + 1;
change(ch[a][i] , ch[b][i] , t - 1 , x);
}
int query(int a ,int b ,int t ,int x){
if(t < 0)return 0;
int i = (x >> t) & 1;
if(sum[ch[b][!i]] - sum[ch[a][!i]] > 0){
return (1 << t) + query(ch[a][!i] , ch[b][!i] ,t - 1 ,x);
}else{
return query(ch[a][i] , ch[b][i] , t - 1 , x);
}
}
int main () {
cin >> n >> m;
T[0] = cnt ++;
change(T[0] , 0 , 25 , 0);
for(int i = 1 ;i <= n ; i ++){
int x ;
scanf("%d" , &x);
qianzhui[i] = qianzhui[i - 1] ^ x;
T[i] = cnt ++;
change(T[i] , T[i - 1] , 25 , qianzhui[i]);
}
for(int i = 1;i <= m ; i ++){
char o[5];
scanf("%s" , &o);
if(o[0] == ‘A‘){
int x;
scanf("%d" , &x);
n ++;
qianzhui[n] = qianzhui[n - 1] ^ x;
T[n] = cnt ++;
change(T[n] , T[n - 1] , 25 , qianzhui[n]);
/*
关于在这里减不减1的话 , 如果我们是要在l - 1 到 r - 1 的话 , 需要减一
下面l r 也需要减一
*/
}else{
int l , r , x;
scanf("%d%d%d" , &l , &r , &x);
r -- ;
if(l == 0){
printf("%d
" , query(0 , T[r] , 25 , x ^ qianzhui[n]));
}else{
l --;
printf("%d
" , query(T[l - 1] , T[r] , 25 , x ^ qianzhui[n]));
}
}
}
}
以上是关于可持久化Trie树的主要内容,如果未能解决你的问题,请参考以下文章