HDU-5801 可持久化Trie树

可持久化-可持久化字典树 可持久化-Trie可持久化 2021年8月2日 可持久化干什么? 可持久化,就是记录每次更改的版本,以便于后续使用从前的版本。对于字典树,就是对每次加入的字符串按次进行记录。 算法原理 建树时,每次新增一个根节点。若查找新增字符串到与上一版本有前缀相同的节点,则新增节点,当存在不同时,直接指向上一版本的节点,随后,新增边存不同的字符。(此处不太清楚,可看下图进行理解) 例:若要存入about,cat,ratcb,rate四个字符串,则有如下建图: 因建立的边是有向边,因此易知,从第i个根节点开始查找,即为 阅读详情

Up Sky,Mr.Zhu

Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 46    Accepted Submission(s): 14


Problem Description
Given a string S[0,...n-1],and the length of each palindrome substring in S is less than 20.

Define special string of a palindrome string STR[0,...,n-1] is STR[floor(n/2),...,n-1]

Given L,R and a string T, Query the number of palindrome strings, whose the prefix of special string is T, in S[L,...,R] 

ps:floor means the function in C++ language
(No relation between statement and title)
 

Input
There are severval cases,please peocess until EOF.
The first line contains string S.(1<=|S|<=1e5)
The second line is a number q means the number of querys.(1<=q<=1e5)
The next q lines,each line contains two numbers L,R and a string T.(1<=L<=R<=|S|,1<=|T|<=10)
All strings only contain 'a','b','c','d' and 'e'.
 

Output
For each query,you should output the number of palindrome strings which satisfied previous condition in a line.
 

Sample Input
  
bceaeedde 5 5 8 e 3 5 e 1 2 a 5 9 d 5 9 de
 

Sample Output
  
3 2 0 4 1
 

Author
UESTC
 

Source

题目链接:

题目大意:
定义一个回文串的特征串为其从中心到结尾的部分,给出一个字符串S,q次询问,每次询问以一个字符串t为特征串前缀落在区间L到R之间的回文串数量,S中回文串长度不会超过20。

解题思路:
先Manacher预处理,然后我们用Trie树来维护以每个位置为起始的特征串,注意到特征串的长度不会超过10,所以我们可以每次按一个长度建立可持久化Trie树,每次对所有询问的区间在线查询,更新答案,做10次即可。
为了不去考虑角码的运算,我将奇偶串分开讨论了,代码就显得有些冗余。最后要吐槽hdu谜一样的java内存机制,开始估计数组最大要开到10^6,结果MLE了,索性开到10^5枚举内存,居然神奇的AC了。

AC代码:
import java.io.*;
import java.util.*;

public class Main {
	static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	static int nextInt() throws IOException    
	{  
	    in.nextToken();    
	    return (int)in.nval;     
	}
	static String next() throws IOException    
	{  
	    in.nextToken();  
	    return in.sval;
	}
	static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));
	static int n,m,len,sz,a;
	static char[] s;
	static char[] ss=new char[200005];
	static int[] pp=new int[200005];
	static int[] aa=new int[100005];
	static int[] bb=new int[100005];
	static int[] cc=new int[100005];
	static int[] rt=new int[100005];
	static int[] ans=new int[100005];
	static int[] cnt=new int[100005];
	static char[][] tt=new char[100005][];
	static int[][] ch=new int[100005][5];
	static void Manacher()
	{
		Arrays.fill(ss,'#');
		for(int i=0;i<n;i++)
			ss[i*2+2]=s[i];
		len=n*2+1;ss[0]='$';
		int max=0,id=0;
		for(int i=1;i<=len;i++)
		{
			if(max>i)
				pp[i]=Math.min(pp[id*2-i],max-i);
			else pp[i]=1;
			while(ss[i+pp[i]]==ss[i-pp[i]])
				pp[i]++;
			if(i+pp[i]>max) { max=i+pp[i];id=i;}
		}
	}
	static void insert(int a,int b,int l,int r)
	{
		int u=a,v=b,p;
		for(int i=l;i<=r;i++)
		{
			p=ss[i]-'a';
			for(int k=0;k<5;k++)
				ch[u][k]=ch[v][k];
			cnt[u]=cnt[v]+1;
			ch[u][p]=++sz;
			u=ch[u][p];v=ch[v][p];
		}
		cnt[u]=cnt[v]+1;
	}
	static int query(int a,int b,int k)
	{
		int u=a,v=b,p;
		for(int i=0;i<tt[k].length;i++)
		{
			p=tt[k][i]-'a';
			u=ch[u][p];v=ch[v][p];
		}
		return cnt[v]-cnt[u];
	}

	public static void main(String[] args) throws IOException {
		//Scanner in=new Scanner(System.in);
		while(in.nextToken()!=StreamTokenizer.TT_EOF)
		{
			s=in.sval.toCharArray();
			n=s.length;
			Manacher();
			for(int i=n;i>0;i--) ss[i]=s[i-1];
			m=nextInt();
			for(int i=1;i<=m;i++)
			{
				aa[i]=nextInt();bb[i]=nextInt();
				tt[i]=next().toCharArray();
				cc[i]=tt[i].length;
			}
			for(int i=1;i<=m;i++) ans[i]=0;
			for(int k=1;k<=10;k++)
			{
				sz=0;rt[0]=++sz;
				for(int i=1;i<=n;i++)
				{
					a=pp[i*2]/2;
					if(a>=k)
					{
						rt[i]=++sz;
						insert(rt[i],rt[i-1],i,i+k-1);
					}
					else rt[i]=rt[i-1];
				}
				for(int i=1;i<=m;i++)
				{
					if(cc[i]>k||k*2-1>bb[i]-aa[i]+1) continue;
					ans[i]+=query(rt[aa[i]+k-2],rt[bb[i]-k+1],i);
				}
				sz=0;rt[0]=++sz;
				for(int i=1;i<=n;i++)
				{
					a=pp[i*2-1]/2;
					if(a>=k)
					{
						rt[i]=++sz;
						insert(rt[i],rt[i-1],i,i+k-1);
					}
					else rt[i]=rt[i-1];
				}
				for(int i=1;i<=m;i++)
				{
					if(cc[i]>k||k*2>bb[i]-aa[i]+1) continue;
					ans[i]+=query(rt[aa[i]+k-1],rt[bb[i]-k+1],i);
				}
			}
			for(int i=1;i<=m;i++)
				out.println(ans[i]);
		}
		out.flush();
	}
}


Trie与可持久化Trie Trie,也称为字典树或前缀树,是一种用于高效存储和检索字符串的树形数据结构。它的主要特点是利用字符串的公共前缀来减少存储空间和提高查询效率。下面是对 Trie 的常见操作的介绍:插入(Insertion):将一个字符串插入到 Trie 中。从根节点开始,逐个字符检查字符串,并根据字符是否存在于当前节点的子节点中进行相应的操作。如果字符不存在,则创建一个新的节点并将其链接到当前节点的子节点上。删除(Deletion):从 Trie 中删除一个字符串。与插入操作类似,逐个字符检查字符串并找到对应的节点。 阅读详情

相关推荐

可持久化trie深度解析(二)

可持久化Trie深度解析 可持久化Trie是一种能保留所有历史版本的字典树数据结构,通过节点复用技术实现高效存储。核心思想是每次插入只复制路径上的节点(约32个),其余节点与历史版本共享。相比普通Trie,它支持历史版本查询、区间最大异或等高级操作。 实现要点: 使用节点池预分配内存 每个节点记录子节点索引和经过的数字个数 插入操作返回新版本根节点 区间查询通过两个版本根节点相减实现 典型应用: 区间最大异或查询(O(logV)时间) 异或第k大查询 历史版本回溯 离线预处理所有前缀信息 空间复杂度O(nl

eniver的博客 372

可持久化数据结构(一):可持久化Trie

近日学习了可持久化数据结构,因此特来总结一下,那就先从最简单的可持久化Trie开始吧!(虽然我理解这个的时间比主席树还久) 一:可持久化Trie的用途 正常的Trie树可以解决字符串的一些问题,特殊的Trie树(比如0/1Trie)可以解决最大异或和的相关问题,但是如果每次的询问是针对区间的,Trie树就不好解决,因为你不能对每个区间都建一棵Trie树,那样空间就会爆炸,于是,我们的可持久化Trie就登场了 二:可持久化Trie的构造 设trie[x][ch],表示从x号节点连向的字符为ch的点的编号(与普

jwg2732的专栏 3498

微信开放标签wx-open-launch-app样式失效?手把手教你正确设置点击区域(附完整代码)

本文详细解析了微信开放标签`wx-open-launch-app`样式失效和点击无响应的常见问题,提供了完整的解决方案和代码示例。通过分析标签内部实现机制,指导开发者正确设置点击区域和样式,确保跨平台兼容性和用户体验优化。

joy55的博客 320

Trie树的可持久化

文章目录

Cauchy的博客 1338

DeepSeek高阶应用:DeepSeek+Coze构建智能文献综述与趋势分析自动化系统

本文详细介绍了如何利用DeepSeek与Coze构建智能文献综述与趋势分析自动化系统。通过DeepSeek的深度语义理解和结构化信息提取能力,结合Coze的可视化工作流编排,实现学术论文的自动解析、分类整理与知识入库。该系统能7x24小时自动追踪领域前沿,将研究人员从繁琐的文献处理中解放出来,专注于更高层次的思考与创新。

weixin_29050271的博客 179

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文详细介绍了秦时明月6.2魔改版的从零到一部署指南,包括环境准备、服务端安装、安卓客户端配置以及GM后台直通等关键步骤。特别针对安卓客户端配置和GM工具使用提供了实用技巧,帮助用户快速搭建并优化游戏服务器,确保稳定运行。

weixin_42522964的博客 317

可持久化字典树 详解

**字典树**是一种利用边权映射到字符集,将字符串保存到一棵树上的数据结构,在查询公共前缀、字符串排序、词频统计方面有着十分优秀的性质。 **可持久化字典树在可持久化方式上与可持久化字典树十分相似**,即每次只修改被添加或值被修改的节点,而保留没有被改动的节点,在上一个版本的基础上连边,使最后每个版本的 Trie 树的根遍历所能分离出的 Trie 树都是完整且包含全部信息的。 在字典树的拓展部分学习过程中,我们提到了一种特殊的字典树:**0-1 Trie**,而在可持久化字典树中,大部分题目都是以0-1

HeartFireY的博客 1969

NDIAurora 6D、5D传感器裸线焊接与烧录 6D传感器型号:10001742;5D传感器型号:610157

NDI Aurora 6D、5D传感器裸线焊接与烧录

yanghong2000719的博客 1201

可持久化Trie详解,最大异或和,k大异或和

因为我们选取的后缀不能空,所以相当于 求 s[p] ^ s[p + 1] ^ …对于查询的部分,因为插入了0,所以 [l, r] 对应 版本/区间 [l + 1, r + 1]那么可以作为次大值的区间就是 [ll + 1, r - 1], [l + 1, rr - 1]因而,我们动态开点,在上一个版本的基础上,增加新的节点,就得到了新版本的Trie。然后我们枚举每个数,记 左边第一个大的为l,第二个为ll,同理有r,rr。因为查询区间是[l, r],所以左边界应该是root[l - 1]

EQUINOX1的博客 2319

【Claude】Disabled organization 错误:组织被禁用的原因与 API Key 绕过方法

如果环境变量存在,下一步是找出它在哪里被设置的。"Disabled organization" 错误的本质不是账户被封,而是认证优先级冲突。环境变量优先级最高始终覆盖 OAuth 订阅认证报错信息具有误导性:"组织被禁用"指的通常是 API Key 所属的组织,而不是你的个人账户旧 Key 是隐形炸弹:即使你已经不再使用某个组织的 API,只要环境变量中残留该 Key,它就会持续覆盖你的订阅认证非交互模式更敏感claude -p模式下,只要有环境变量,就会强制使用它,完全忽略/login。

博客 8877

使用R语言绘制Logistic回归模型的亚组分析森林图

亚组分析是一种常用的统计方法,用于探索不同亚组之间的差异,并确定是否存在某些变量对结果的调节作用。在本文中,我们将使用R语言来绘制Logistic回归模型的亚组分析森林图。在该图中,每个亚组都用一个点表示,点的位置表示亚组的均值,而线段表示亚组的置信区间。垂直参考线用于表示效应值为0的点,帮助我们判断亚组之间的差异。希望本文对你有所帮助,让你能够使用R语言绘制Logistic回归模型的亚组分析森林图。是一个二分类的变量,我们希望在亚组分析中探索它与响应变量之间的关系。函数来计算每个亚组的均值,并使用。

PixelNinja的博客 2004

hdu 4757 Tree(可持久化Trie)

题意:给出一棵树,每个点上有权值,有m组询问,每次询问从x到y的路径上的权值与z异或的最大值为多少。 思路:把每个点的权值用二进制表示,然后插入Trie。利用可持久化Trie可以查询历史信息的特点,每个节点保存从当前点到根节点的Trie。对于每个查询,在Trie中查询,对于每一位,寻找与z对应位相反的分支,如果有,结果res|=(1 代码: #pragma comment(linke

绝望的乐园 1671

GEE APP:基于GEE的红树林监测平台

本文将介绍如何利用Google Earth Engine平台,结合Landsat系列卫星影像和SRTM高程数据,实现红树林分布的动态监测与变化分析。

此星光明博客 160

HDU - 4575 Tree(可持久化字典树)

HDU - 4575 Tree(可持久化字典树) Problem Description Zero and One are good friends who always have fun with each other. This time, they decide to do something on a tree which is a kind of graph that there is only one path from node to node. First, Zero will give

Vmorish 687

127.手机防回滚机制(Anti-Rollback)详解|efuse熔丝原理与降级绕过方案

手机刷机与维修技术指南 本文针对电子工程师和维修人员,详细介绍了主流手机品牌(高通、联发科、苹果)的刷机原理与维修方法。内容包括三大平台的刷机协议差异、关键操作模式(Fastboot/DFU/EDL)、分区表修复等核心技术,并提供了完整的Python自动化刷机脚本。文章重点解决系统崩溃、基带丢失、分区损坏等常见故障,涵盖从环境搭建到具体操作的全流程指导,所有指令均经过实测验证。适用于专业维修场景下的跨品牌设备修复需求。

2601_95651806的博客 294

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

hdu 5801 Up Sky,Mr.Zhu(2016多校第六场1009) 可持久化字典树

因为只有20,所以我们按长度建可持久化字典树,然后询问时枚举长度即可,长度为奇数和偶数可以分开求。 #include #include #include #include #include using namespace std; const int maxn=100105; int root[2][10][maxn]; int cnt; namespace Trie{ int sum

huantwofat 861

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

acm常用模板

数位dp moban HDU 5787 K-wolf Number数位dp 二维bit优化dp 数据结构 后缀数组 AC自动机 在线AC自动机 回文树 主席树 标记永久化 prefix字典树 hdu5790 二叉搜索树 nlogn建树kmp 可持久化Trie HDU 5801 Up SkyMrZhu 树上莫队 SPOJ Count on a tree II树上莫队 HDU 5799 This wor

xfzero的博客 1169

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

trie 树及其可持久化

trie 树及其可持久化 前言 本文主要介绍字符串组的存储方法,trie 字典树,首先我们讨论 trie 树的几个问题: trie 树的提出 trie 树的实现 trie 树的应用 在 trie 树的应用之中,我们介绍的它的特殊形式:01 字典树,并介绍区间异或最值问题。掌握 trie 树的相关算法后,讨论 trie 树的可持久化,解决更多的问题。 trie 字典树 trie 树的提出 存储大...

洋溢 6018

可持久化字典树

赶锅中 咕咕咕 $ \tiny\text{前置知识:字典树(trie),可持久化线段树(主席树)}$ 简介 可持久化字典树(可持久化trie)是一种可以查询历史版本的字符串的数据结构。它支持末尾插入,区间查询,相当于多叉、不平衡的主席树。 原理 同主席树。 实现 对于每一个节点,需要记录的信息类似于普通的trie,添加新点时需要把\(last\)节点的所有到儿子的转移复制到新节点上。 //普通可持...

weixin_30826761的博客 376

可持久化01trie字典树

可持久化01trie字典树是个比较复杂的数据结构,和主席树的构成原理很相似。区别就在主席树构造时候左右子树都是显示的,而可持久化01的左右(0或1)其中的一个是隐藏的,一开始看会有些抽象。题目意思:给一棵树,树上每个节点有权值,给q个询问,每次询问u,v。我们建造1~1的线段树,1~2状态的线段树,1~3状态的线段树,1~4状态的线段树。我们可以用dfn序把树上问题转化成区间问题,然后就可以直接套可持久化的板子了。但这样建造,复杂度太高了,所以我们需要优化空间。同理,可持续化01trie也是这样。

fanshui682的博客 526

trie树(三) 可持久化

那么每次为了精确遍历一个区间[l,r]的01trie,我们会在插入时给每一个节点标上一个tag,代表它最晚是什么时候插入的(或者是共用),记为last[i],那么只要last[i]>=l即可。这个想法很明显不成熟,所以我们加以改进,尝试充分利用空间,那么自然会想到可持久化,在之前的历史版本上加入一条新的链代表一个数即可。里学过的01trie,但是普通的01trie是针对一整颗树求最大异或值的,而此题很明显是在对区间进行询问。所以,我们可以对每一个区间都建一颗01trie!看到异或最大值,不难想到我们在。..

sophilex的博客 390

可持久化Trie(可持久化字典树):

构建可持久化Trie所需的空间和时间复杂度都是字符串的总长度的线性函数。 比例系数为字符集大小。 例题:AcWing 256. 最大异或和: 给定一个非负整数序列 a,初始长度为 N。 有 M 个操作,有以下两种操作类型: 1、”A x”:添加操作,表示在序列末尾添加一个数 x,序列的长度 N 增大1。 2、”Q l r x”:询问操作,你需要找到一个位置 p,满足l≤p≤r,使得:a[p] xo...

_Griefs 372

可持久化(线段树(主席树),tire)

可持久化数据结构是一种能够在多次修改操作后仍能访问历史版本数据的数据结构。以下是对它的详细介绍:定义与特点定义:可持久化数据结构通过某种方式记录数据结构在不同时间点的状态,使得在进行一系列插入、删除或修改操作后,仍然可以高效地访问和查询过去某个时刻的数据结构状态。特点:它允许在不复制整个数据结构的情况下,创建多个版本的数据结构,每个版本都反映了在某个特定操作序列之后的数据状态,从而节省了大量的空间和时间开销。常见类型。

2401_84910613的博客 1035
上一篇: HDU-5785 Manacher+区间处理
下一篇: HDU-5790 Tire树+主席树
AC_Machine
博客等级 码龄11年 1粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值