Trie树-可持久化
// Made by xiper
// updata time : 2015 / 12 / 8
// test status: √ // 使用前调用初始化函数 init() 同时 root[0] = 0;
struct Trie_Persistent
{
const static int LetterSize = ; // 字符集大小
const static int TrieSize = * ( 1e5 + ); // 可能的所有节点总数量
int tot; // 节点总数 //节点类型
struct node
{
int ptr[LetterSize]; // trie_node_ptr[]
int cnt[LetterSize]; // 维护字符集数目
}tree[TrieSize]; // 获取字符集哈希编号 , 必须在 [0 , LetterSize) 之内
inline int GetLetterIdx(int c){return c - 'a';} // 插入字符串 str , 上一个副本是 f
int insert(const char * str ,int f){
int len = strlen( str );
int res = tot++; // 建立虚拟根结点
tree[res] = tree[f]; // 初始化
int cur = res; // 当前指针
for(int i = ; i < len ; ++ i){
int idx = GetLetterIdx( str[i] ); // 获取字符编号
int p = tot ++ ; // 创建下一个虚拟节点
tree[cur].cnt[idx] ++ ;
tree[cur].ptr[idx] = p;
f = tree[f].ptr[idx]; // 上一个副本的指针更新
tree[p] = tree[f]; // updata information;
cur = tree[cur].ptr[idx]; // updata ptr
}
return res;
} // 在 [l ,r] 副本中查找字符串str
// 参数带入( str , root[l-1] , root[r])
int find(const char * str , int l ,int r){
int len = strlen(str);
for(int i = ; i < len ; ++ i){
int idx = GetLetterIdx ( str[i] ); // 获取字符Hash
int cnt = tree[r].cnt[idx] - tree[l].cnt[idx];
if(!cnt) return ;
l = tree[l].ptr[idx];
r = tree[r].ptr[idx];
}
return ;
} void init(){tot = ;for(int i = ; i < LetterSize ; ++ i) tree[].ptr[i] = , tree[].cnt[i] = ; } // 虚拟节点 }trie;
Trie树-可持久化的更多相关文章
- 【BZOJ-4212】神牛的养成计划 Trie树 + 可持久化Trie树
4212: 神牛的养成计划 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 136 Solved: 27[Submit][Status][Discus ...
- 【BZOJ3439】Kpm的MC密码 Trie树+可持久化线段树
[BZOJ3439]Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当 ...
- 【BZOJ4212】神牛的养成计划 Trie树+可持久化Trie树
[BZOJ4212]神牛的养成计划 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变 ...
- BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树
题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...
- 可持久化Trie树初步
可持久化Trie树和可持久化线段树很像,依次插入信息,通过减法来进行历史版本查询. 2015年11月27日 bzoj3261 最大异或和 我们需要计算 a[p] xor a[p+1] xor ... ...
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- BZOJ4477[Jsoi2015]字符串树——可持久化trie树
题目描述 萌萌买了一颗字符串树的种子,春天种下去以后夏天就能长出一棵很大的字符串树.字符串树很奇特,树枝上都密密麻麻写满了字符串,看上去很复杂的样子.[问题描述]字符串树本质上还是一棵树,即N个节点N ...
- BZOJ5338 [TJOI2018] Xor 【可持久化Trie树】【dfs序】
题目分析: 很无聊的一道题目.首先区间内单点对应异或值的询问容易想到trie树.由于题目在树上进行,case1将路径分成两段,然后dfs的时候顺便可持久化trie树做询问.case2维护dfs序,对d ...
- 算法笔记--字典树(trie 树)&& ac自动机 && 可持久化trie
字典树 简介:字典树,又称单词查找树,Trie树,是一种树形结构,是哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较. 性质:根节点不包含字符,除根节点外每一个 ...
随机推荐
- IBatis 配置一对多
-------说明-------- IBatis 版本2.0 配置一对多 namespace = testDao ------------------ /** *班级的resultMap *Class ...
- [moka同学笔记]yii2.0查询数据库
一. [:id占位符]使用 $results = Test::findBySql($sql,array(':id'=>'1 or 1=1))->all() 二. [id=1] 选 ...
- question about import google file
1. question descibe; once, one css file(app.css) of my web project has sentence like this: @import u ...
- ningx配置ModSecurity重启出现兼容性问题:ModSecurity: Loaded PCRE do not match with compiled!的解决方法
nginx开启错误日志,然后重启nginx,出现如下信息: 2016/12/03 09:40:38 [notice] 18858#0: ModSecurity for nginx (STABLE)/2 ...
- 数据库设计==>>MySchool
1.数据库设计的步骤 第一步:需求分析(收集信息) 第二步:绘制 E-R 图 (标示实体 ,找到实体的属性 第三步:将 E-R 图转换成数据库模型图 第四步:将数据库模型图转换成数据表 2.如何绘制 ...
- windows下使用makecert命令生成自签名证书
1.makecert命令路径 C:\Program Files (x86)\Windows Kits\8.1\bin\x64 2.生成一个自签名证书 makecert -r -pe -n " ...
- 关于SQL Server的WITH(NOLOCK)和(NOLOCK)
The difference is that you should be using the syntax WITH (NOLOCK) (or WITH (<any table hint> ...
- 【JavaEE】Hibernate继承映射,不用多态查询只查父表的方法
几个月前,我在博问里面发了一个问题:http://q.cnblogs.com/q/64900/,但是一直没有找到好的答案,关闭问题以后才自己解决了,在这里分享一下. 首先我重复一下场景,博问里面举的动 ...
- 【JavaEE】SSH+Spring Security基础上配置AOP+log4j
Spring Oauth2大多数情况下还是用不到的,主要使用的还是Spring+SpringMVC+Hibernate,有时候加上SpringSecurity,因此,本文及以后的文章的example中 ...
- 自制html5塔防游戏
这是一款由html5里的canvas和普通html元素结合的小游戏,游戏比较简单单一.主要是以建塔,防御为主.下面是游戏的一张截图: 这里是游戏的地址,直接去玩下吧:http://www.lovewe ...