C09【模板】可持久化字典树(Trie)

视频链接:C09 可持久化字典树(Trie)_哔哩哔哩_bilibili

 

 

 

// 区间最大异或和 可持久化01Trie O(n*23)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=600005;
int n,m,idx,cnt;
int rt[N],ch[N*25][2],siz[N*25];

void insert(int v){
  rt[++idx]=++cnt; //新根开点
  int x=rt[idx-1]; //旧版
  int y=rt[idx];   //新版
  for(int i=23;i>=0;i--){
    int j=v>>i&1;
    ch[y][!j]=ch[x][!j]; //异位继承
    ch[y][j]=++cnt;      //新位开点
    x=ch[x][j]; y=ch[y][j]; //走位
    siz[y]=siz[x]+1;     //新位多1
  }
}
int query(int x,int y,int v){
  int ans=0;
  for(int i=23;i>=0;i--){
    int j=v>>i&1;
    if(siz[ch[y][!j]]>siz[ch[x][!j]])
      x=ch[x][!j], y=ch[y][!j], ans+=(1<<i);
    else
      x=ch[x][j], y=ch[y][j];
  }
  return ans;
}
int main(){
  char op[5]; int l,r,x;
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++){
    scanf("%d",&x);
    insert(x);
  }
  while(m--){
    scanf("%d%d%d",&l,&r,&x);
    printf("%d\n",query(rt[l-1],rt[r],x));
  }
}

 

 

 

Luogu P4735 最大异或和

// 可持久化01Trie O(n*23)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=600010;
int n,m,idx,cnt;
int rt[N],ch[N*25][2],siz[N*25];

void insert(int v){
  rt[++idx]=++cnt; //新根开点
  int x=rt[idx-1]; //旧版
  int y=rt[idx];   //新版
  for(int i=23;i>=0;i--){
    int j=v>>i&1;
    ch[y][!j]=ch[x][!j]; //异位继承
    ch[y][j]=++cnt;      //新位开点
    x=ch[x][j]; y=ch[y][j]; //走位
    siz[y]=siz[x]+1;     //新位多1
  }
}
int query(int x,int y,int v){
  int ans=0;
  for(int i=23;i>=0;i--){
    int j=v>>i&1;
    if(siz[ch[y][!j]]>siz[ch[x][!j]])
      x=ch[x][!j], y=ch[y][!j], ans+=(1<<i);
    else
      x=ch[x][j], y=ch[y][j];
  }
  return ans;
}
int main(){
  char op[5]; int l,r,x,s=0;
  scanf("%d%d",&n,&m); 
  insert(0); //插个左边界0
  for(int i=1; i<=n; i++){
    scanf("%d", &x);
    s^=x;
    insert(s);
  }
  while(m--){
    scanf("%s",op);
    if(*op=='A'){
      scanf("%d",&x);
      s^=x;
      insert(s);
    }
    else{
      scanf("%d%d%d",&l,&r,&x);
      printf("%d\n",query(rt[l-1],rt[r],s^x));
    }
  }
}

  

练习:

P5283 [十二省联考 2019] 异或粽子 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P4098 [HEOI2013] ALO - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P4592 [TJOI2018] 异或 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 

posted @ 2022-08-08 23:14  董晓  阅读(1188)  评论(0编辑  收藏  举报