首页 > 其他分享 >可持久化数据结构

可持久化数据结构

时间:2024-09-11 08:54:54浏览次数:1  
标签:持久 val int tr trie 异或 数据结构 las

可持久化线段树

这个

可持久化字典树

最大异或和

考虑设 \(s\) 为 \(a\) 的前缀异或和数组,我们最终的答案就是找一个 \(p\in[l-1,r-1]\),然后求出 \(s_n\operatorname{xor} x\operatorname{xor} s_p\)。

首先,对于最大异或数对问题,可以使用 \(01\) \(trie\) 解决,这里不再赘述。

类似于可持久化线段树,我们查询版本 \([l,r]\) 就是对前 \(r\) 个版本与前 \(l-1\) 个版本做差得到的,于是我们对于每个版本,先继承上一个版本,然后插入这个数。

然后我们每次修改就是开启一个新版本然后插入一个数,查询直接按照查询最大异或数对的方式对 \(s_n\operatorname{xor} x\) 进行查询即可。

代码:

#include<bits/stdc++.h>
#define int long long
#define N 600005
#define K 31
using namespace std;
int n,q,a[N],s[N];
struct trie{
	int rt[N],tr[N*K][2],val[N*K],idx;
	void ins(int las,int p,int v){
		for(int i=K-1;~i;i--){
			val[p]=val[las]+1;
			int t=v>>i&1;
			tr[p][t]=++idx;
			tr[p][!t]=tr[las][!t];
			p=tr[p][t];
			las=tr[las][t];
		}
		val[p]=val[las]+1;
	}
	int qry(int p,int q,int v){
		int res=0;
		for(int i=K-1;~i;i--){
			int t=v>>i&1;
			if(val[tr[q][!t]]-val[tr[p][!t]]){
				res+=1<<i;
				p=tr[p][!t];
				q=tr[q][!t];
			}
			else{
				p=tr[p][t];
				q=tr[q][t];
			}
		}
		return res;
	}
}trie;
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s[i]=s[i-1]^a[i];
	}
	for(int i=1;i<=n;i++){
		trie.rt[i]=++trie.idx;
		trie.ins(trie.rt[i-1],trie.rt[i],s[i]);
	}
	while(q--){
		char op;
		int l,r,x;
		cin>>op;
		if(op=='A'){
			cin>>a[++n];
			s[n]=s[n-1]^a[n];
			trie.rt[n]=++trie.idx;
			trie.ins(trie.rt[n-1],trie.rt[n],s[n]);
		}
		else{
			cin>>l>>r>>x;
			l--;r--;
			if(l==0)cout<<max(s[n]^x,trie.qry(trie.rt[0],trie.rt[r],s[n]^x))<<'\n';
			else cout<<trie.qry(trie.rt[l-1],trie.rt[r],s[n]^x)<<'\n';
		}
	}
	return 0;
}

标签:持久,val,int,tr,trie,异或,数据结构,las
From: https://www.cnblogs.com/zxh923aoao/p/18407600

相关文章

  • 小说推文:每日三位数收益轻松实现,稳定回报持久保障!
    该项目操作简便,仅需制作和发布视频即可,且全程可通过AI工具完成。项目潜力巨大,短视频平台用户基础广泛,覆盖面广。此外,同一视频可发布至多个平台,不会被判定为非原创。随着短视频平台的持续发展和用户基数的增长,小说推文项目依然具有很大的发展潜力。我们希望更多的人能发现并......
  • 小说推文:每日三位数收益轻松实现,稳定回报持久保障!
    该项目操作简便,仅需制作和发布视频即可,且全程可通过AI工具完成。项目潜力巨大,短视频平台用户基础广泛,覆盖面广。此外,同一视频可发布至多个平台,不会被判定为非原创。随着短视频平台的持续发展和用户基数的增长,小说推文项目依然具有很大的发展潜力。我们希望更多的人能发现并......
  • 小说推文:每日三位数收益轻松实现,稳定回报持久保障!
    该项目操作简便,仅需制作和发布视频即可,且全程可通过AI工具完成。项目潜力巨大,短视频平台用户基础广泛,覆盖面广。此外,同一视频可发布至多个平台,不会被判定为非原创。随着短视频平台的持续发展和用户基数的增长,小说推文项目依然具有很大的发展潜力。我们希望更多的人能发现并......
  • C++入门基础知识59——【关于C++数据结构】
    成长路上不孤单......
  • Python数据结构集合的相关介绍
    集合是一种无序、可变的数据结构,它也是一种变量类型,集合用于存储唯一的元素。集合中的元素不能重复,并且没有固定的顺序。在Python提供了内置的 set 类型来表示集合,所以关键字set就是集合的意思。你可以使用大括号 {} 或者 set() 函数来创建一个集合。my_set={1,2,......
  • 重头开始嵌入式第三十七天(数据结构 链表)
    单向链表单向链表是一种常见的数据结构。一、结构组成-节点:单向链表由多个节点组成。每个节点包含两个部分,一个是存储数据的部分,可以存储各种类型的数据,如整数、字符、结构体等;另一个是指向下一个节点的指针,用于连接链表中的各个节点。-头指针:链表有一个特殊的指针称为头......
  • 数据结构实验报告1(集合)
    学习目标:        掌握抽象数据类型的表示与实现方法。学习内容:        描述一个集合的抽象数据类型ASet,其中所有元素为整数且所有元素不相同,集合的基本操作包括:由整数数组a[0..n-1]创建一个集合。输出集合中的所有元素。判断一个元素是否在一个集合中。求......
  • 数据结构—链表
    一:链表1、数组是连续的内存空间;而链表可以不一定是连续的内存空间2、单端链表;从前一个元素指向后一个元素3、链表的功能(1)访问o(n):数组是通过下表或者索引访问元素;链表是通过next指针以此递归的进行查询判断(2)搜索o(n):从头部遍历;知道找到位置(3)插入o(1):(4)删除o(1):4、特......
  • 数据结构(王道考研书)
    第一章绪论1.1数据结构的基本概念1.1.1基本概念和术语     数据:是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。    数据元素:是数据的基本单位,通常作为一个整体......
  • 【数据结构】详细介绍各种排序算法,包含希尔排序,堆排序,快排,归并,计数排序
    目录1.排序1.1概念1.2常见排序算法2.插入排序2.1直接插入排序2.1.1基本思想2.1.2代码实现2.1.3特性2.2 希尔排序(缩小增量排序)2.2.1基本思想2.2.2 单个gap组的比较2.2.3 多个gap组比较(一次预排序)2.2.4 多次预排序2.2.5 特性3.选择排序3.1直......