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

【模板】可持久化Trie树

时间:2022-09-28 19:45:43浏览次数:74  
标签:cnt 持久 val Trie int depth sid id 模板

理解了所谓⌈可持久化⌋的含义之后也就没多难了。

\(\textrm{luogu P4735 最大异或和}\)

#include <iostream>
const int N = 3e5+10;
struct TRIE {
	int sid[2];
	int cnt;
} trie[N*64];
int trie_tot;
#define cnt(id) trie[id].cnt
#define sid(id,ch) trie[id].sid[ch]
int insert(int id,int x,int depth) {
	int new_node = ++trie_tot;
	cnt(new_node) = cnt(id)+1;
	if(depth == 0) 
		return new_node;
	sid(new_node,(x>>(depth-1))&1) = insert(sid(id,(x>>(depth-1))&1),x,depth-1);
	sid(new_node,!((x>>(depth-1))&1)) = sid(id,!((x>>(depth-1))&1));
	return new_node;
}
int query(int pst,int ftr,int val,int depth) {
	if(depth <= 0) 
		return 0;
	if(cnt(sid(ftr,!((val>>(depth-1))&1)))-cnt(sid(pst,!((val>>(depth-1))&1))) > 0) 
		return (1<<(depth-1))+query(sid(pst,!((val>>(depth-1))&1)),sid(ftr,!((val>>(depth-1))&1)),val,depth-1);
	else 
		return query(sid(pst,(val>>(depth-1))&1),sid(ftr,(val>>(depth-1))&1),val,depth-1);
}
void dfs(int id,int depth) {
	if(depth < 0) 
		return;
	printf("%d(%d %d) : %d : %d\n",id,sid(id,0),sid(id,1),depth,cnt(id));
	if(sid(id,0))
		dfs(sid(id,0),depth-1);
	if(sid(id,1))
		dfs(sid(id,1),depth-1);
	printf("%d complete\n",id);
}
int n, m;
int a[N];
int root[N<<1];
int ver_tot;
int now_xor;
int l, r, x;
char opt[2];
int main() {
	scanf("%d %d",&n,&m);
	for(register int i = 1;i <= n;++i) 
		scanf("%d",&a[i]);
	for(register int i = n;i >= 1;--i) 
		a[i] ^= a[i+1];
	for(register int i = 1;i <= n;++i) 
		root[i] = insert(root[i-1],a[i],24);
	ver_tot = n;
	for(register int i = 1;i <= m;++i) {
		scanf("%s",opt);
		switch(opt[0]) {
			case 'A' :
				scanf("%d",&x);
				now_xor ^= x;
				++ver_tot;
				root[ver_tot] = insert(root[ver_tot-1],x^now_xor,24);
				break;
			case 'Q' :
				scanf("%d %d %d",&l,&r,&x);
				printf("%d\n",query(root[l-1],root[r],x^now_xor,24));
				break;
			case 'D' : 
				scanf("%d",&x);
				dfs(root[x],24);
		}
	}
	return 0;
}

标签:cnt,持久,val,Trie,int,depth,sid,id,模板
From: https://www.cnblogs.com/bikuhiku/p/persistent_trie.html

相关文章

  • Trie
    基本概念Trie树又被称之为字典树,前缀树;它是一种针对字符串进行维护的数据结构;它也是一种可用来存储词典的数据结构;核心思想词典里的每个单词就是从根节点出发一直到某......
  • 2022国庆节手抄报模板简单又漂亮,可用手机打印出来
    2022年国庆节马上就要到了,相信有不少小学生的父母都在做同一件事情,这就是辅导孩子完成一张国庆节手抄报。有的父母或孩子是比较有画画天赋的,能够轻松完成一份庆祝国庆节的......
  • AcWing 算法提高课 可持久化
    可持久化的前提:数据结构本身的拓扑结构不变trie、线段树、树状数组、堆等都可持久化平衡树(一般)需要左旋和右旋,不可持久化  可持久化希望将数据结构的全部修改记录下......
  • Visio添加三种UML2.5模板
    微软Visio开发团队2月23日的Blog中提到,Visio除了原有的UML模板外,新增了三种UML2.5模板,支持组件图、通信图和部署图。​​https://blogs.office.com/2017/02/23/visualize-w......
  • Pinia持久化
    Pinia是Vue的存储库安装1、vue3npminstallpinia--save2、vue2npminstallpinia@vue/composition-api--save引入1、vue3再main.js中import{createPinia......
  • elsarticle 模板提示 Overfull \hbox (2.61108pt too wide) 问题的解决
    在用Elsevier提供的elsarticle模板写作时,编译提示:Overfull\hbox(2.61108pttoowide)一般情况下,该提示是说程序找不到合适的换行点,导致某行文字太满(Overfull),但这......
  • Redis的持久化方式RDB和AOF的区别
    1.概论使用到Redis做缓存,方便多个业务进程之间共享数据。由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数......
  • 使用word模板生成新的PDF文件
    摘要本文通过使用word模板文件,替换文件中的参数,转化为PDF文件放入response流实现PDF下载。话不多说,进入正题导入依赖<dependency><groupId>org.apache.poi......
  • docker-swarm集群及NFS持久化存储方案
    一、系统环境系统centos7.6主机4台(1管理节点+3工作节点)docker版本19.03.13禁用防火墙开启以下配置:cat>>/etc/sysctl.conf<<EOFnet.bridge.bridge-nf-call-ip6tab......
  • 模板方法设计模式基础知识!
    模板方法设计模式该设计模式解决的问题是:具有固定算法(步骤)的应用。但这些算法步骤,又针对不同的用户(情况)具有不同的实现方式。在该设计模式中,具有两大类方法:模板方法,步......