首页 > 其他分享 >可持久化字典树【模板】

可持久化字典树【模板】

时间:2023-05-01 10:45:11浏览次数:28  
标签:pre ch 持久 int maxn 字典 模板 nw

可持久化字典树

P4735 最大异或和

#include <bits/stdc++.h>
using namespace std;

const int maxn=6e5+10;
int n,m,sum[maxn],x,l,r,cnt=0;
int ch[maxn*25][2],ver[maxn*25],root[maxn];
//ch表示字典树数组,ver表示每个接节点的版本(第几个字典树),root表示每个点所在的那个字典树的根
char s;

void add(int nw,int pre,int x){//压入当前的根nw,上一个字典树的根pre,这个字典树的编号
  ver[nw]=x;
  for(int i=23;i>=0;i--){
  	int c=(sum[x]>>i)&1;
    ch[nw][!c]=ch[pre][!c];
    ch[nw][c]=++cnt;
    nw=ch[nw][c];pre=ch[pre][c];
    ver[nw]=x;
  }
}

int query(int nw,int limit,int val){//当前字典树的根nw,下限limit,所异或的值val
  int res=0;
  for(int i=23;i>=0;i--){
    int c=(val>>i)&1;
    if(ver[ch[nw][!c]]>=limit) nw=ch[nw][!c],res+=(1<<i);
    else nw=ch[nw][c];
  }
  return res;
}

int main(){
  /*2023.5.1 hewanying P4735 最大异或和 可持久化字典树*/ 
  scanf("%d%d",&n,&m);
  ver[0]=-1;
  root[0]=++cnt;
  add(root[0],0,0);
  for(int i=1;i<=n;i++){
  	scanf("%d",&x);
  	root[i]=++cnt;
  	sum[i]=sum[i-1]^x;
  	add(root[i],root[i-1],i);
  }
  for(int i=1;i<=m;i++){
    scanf(" %c",&s);
    if(s=='A'){
      scanf("%d",&x);
      root[++n]=++cnt;
	  sum[n]=sum[n-1]^x;
      add(root[n],root[n-1],n);
	}
	else{
	  scanf("%d%d%d",&l,&r,&x);
	  printf("%d\n",query(root[r-1],l-1,x^sum[n]));
	}
  }
  return 0;
}

标签:pre,ch,持久,int,maxn,字典,模板,nw
From: https://www.cnblogs.com/hewanying0622/p/17366248.html

相关文章

  • Django - json_script 模板语言,将queryset转换为前端json数据
     models.pyclassUser(models.Model):name=models.CharField(verbose_name="Name",max_length=64) serializer.pyclassUserSerializer(serializers.ModelSerializer):classMeta:model=Userfields=["name",......
  • 6344. 字典序最小的美丽字符串-343
    字典序最小的美丽字符串如果一个字符串满足以下条件,则称其为美丽字符串:它由英语小写字母表的前k个字母组成。它不包含任何长度为2或更长的回文子字符串。给你一个长度为n的美丽字符串s和一个正整数k。请你找出并返回一个长度为n的美丽字符串,该字符串还满足:在字......
  • Angular4_下拉框多选(支持响应式表单验证和模板驱动表单验证)
    支持Angular的响应式表单验证和模板驱动表单验证效果图:UsingwithTemplatedrivenFormsSkills*requiredAngularNameEmailAddress*requiredSubmitName [email protected]{"name":"","email&qu......
  • 区间不同数的个数 二维数点 扫描线 可持久化线段树
    二维数点,对于询问的\([l,r]\)区间我们只需要统计有多少个数上一次出现的位置\(pos\)满足\(pos\leql\),即可。template<classT>structBIT{Tc[N];intsize;voidresize(ints){size=s;}Tquery(intx){//1...xassert(x<=size);......
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介模板方法模式(TemplateMethodPattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法,从而对剩余的逻辑有......
  • Python打印一个字典,输出带双引号
    Python中dict(字典)默认的表示方式是用单引号表示键和值,例如:my_dict={'key1':'value1','key2':'value2'}print(my_dict)这将输出:{'key1':'value1','key2':'value2'}如果你想使用双引号代替单引号进行表示,可以使用json模块来实现。......
  • 第四篇:白话tornado源码之褪去模板外衣的前戏
    原笔记博客链接:https://www.cnblogs.com/wupeiqi/p/4592637.html 执行字符串表示的函数,并为该函数提供全局变量本篇的内容从题目中就可以看出来,就是为之后剖析tornado模板做准备,也是由于该知识点使用的巧妙,所有就单独用一篇来介绍了。废话不多说,直接上代码:#!u......
  • P7603 [THUPC2021] 鬼街(减半警报器模板)
    P7603[THUPC2021]鬼街(减半警报器模板)前言这是一个由lxl大佬提出的神奇trick,第一次省选集训的时候有点颓,听完了没写。刚好明天又要讲这个不如写篇题解。还是,我太弱了;所以又是研究一晚上才写出来,所以还是吧我对这道题的理解讲讲。正文何为折半报警器按照lxl的ppt上的......
  • 有序数组(类模板)
    一、问题描述:实现一个类模板,它可以接受一组数据,能对数据排序,也能输出数组的内容。每行输入的第一个数字为0,1,2或3:为0时表示输入结束;为1时表示将输入整数,为2时表示将输入有一位小数的浮点数,为3时表示输入字符。如果第一个数字非0,则接下来将输入一个正整数,表示即将输入的数据的......
  • vscode pont 模板使用
    一、安装安装插件vscode创建项目PSE:\Code\Vues>mkdirapricot-pont1、创建目录全局安装pont-engine$npmi-gpont-engine1、安装pont-engine二、使用配置模板$pontstart1、配置模板安装依赖$npmi-Dpont-engine1、安装依赖......