可持久化-Trie可持久化

2021年8月2日

可持久化干什么?

可持久化,就是记录每次更改的版本,以便于后续使用从前的版本。对于字典树,就是对每次加入的字符串按次进行记录。

算法原理

建树时,每次新增一个根节点。若查找新增字符串到与上一版本有前缀相同的节点,则新增节点,当存在不同时,直接指向上一版本的节点,随后,新增边存不同的字符。(此处不太清楚,可看下图进行理解)

例:若要存入about,cat,ratcb,rate四个字符串,则有如下建图:

因建立的边是有向边,因此易知,从第i个根节点开始查找,即为对第i个版本进行查找。

如何建图?

首先,对于每次加入新的字符串,都要新增一个根节点:

for(int i = 1; i <= n; i++){cin >> str;root[i]=spot++;insert(str, root[i], root[i-1]);
}

随后,在函数中建图:

void insert(string str, int q, int p) {for (int i = 0; i < str.length(); i++) {int t = str[i] - 'a';if (p) {//若前缀相同则继续查找for (int j = 0; j < 26; j++) {//每个节点都要对比if (j != t)st[q][j] = st[p][j];//不是同前缀,直接连线elseif (st[p][t]) flag = 1;//若存在相同前缀,则进行标记}}st[q][t] = spot++;q = st[q][t];if (flag)p = st[p][t];//相同前缀,走到下一位elsep = 0;//否则停止对比,直接新增节点}
}

查询则是按照正常字典树查询方式,不同之处就是从每个版本的根节点开始查找。

bool search(int i, string str) {int p = root[i];//从第i个根节点进行查找for (int i = 0; i < str.length(); i++){int t = str[i] - 'a';if (!st[p][t]) return false;else p = st[p][t];}return true;
}

模板题:

输入n和m,接下来n行输入n个字符串,随后m行输入一个数字和一个字符串,数字代表第i个版本,输出字符串是否存在于第i个版本中。

输入样例:
4 5
about
cat
ratch
rate
2 rate
3 rate
4 rate
4 ratch
1 cat

预期输出

0
0
1
1
0

代码:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string>
#include<string.h>using namespace std;int n, m, root[1005];
int st[1005][1005];
int flag, spot = 1;
string str;void insert(string str, int q, int p) {for (int i = 0; i < str.length(); i++) {int t = str[i] - 'a';if (p) {//若前缀相同则继续查找for (int j = 0; j < 26; j++) {//每个节点都要对比if (j != t)st[q][j] = st[p][j];elseif (st[p][t]) flag = 1;}}st[q][t] = spot++;q = st[q][t];if (flag)p = st[p][t];elsep = 0;}
}bool search(int i, string str) {int p = root[i];for (int i = 0; i < str.length(); i++){int t = str[i] - 'a';if (!st[p][t]) return false;else p = st[p][t];}return true;
}int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> str;root[i] = spot++;insert(str, root[i], root[i - 1]);}while (m--) {cin >> n >> str;cout << search(n, str) << endl;}return 0;
}

可持久化-可持久化字典树相关推荐

  1. BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...

  2. 中石油训练赛 - 腿部挂件(可持久化字典树)

    题目描述 Jim是一个热爱打游戏的小伙子,可惜他的游戏水平不太行,以至于经常在游戏里被别人欺负.而且Jim不仅游戏玩的菜,他还很爱喷人,但是由于自己的垃圾操作,他又喷不过别人.为了改善这种局面,Jim ...

  3. [十二省联考 2019] 异或粽子(可持久化字典树 + 二叉堆)

    problem luogu-P5283 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 nnn 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 111 到 nn ...

  4. P4735 最大异或和(可持久化字典树)

    题目链接:P4735 最大异或和 Description 给定一个非负整数序列 {a},初始长度为 N. 有   M个操作,有以下两种操作类型: 1 .A x:添加操作,表示在序列末尾添加一个数 x, ...

  5. Luogu P4735(可持久化字典树)

    链接:点击打开链接 题意: 给定一个非负整数序列 {a},初始长度为n. 有 m 个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 n+1. Q l r x:询 ...

  6. [(可持久化)字典树 优化建图][2-SAT] LOJ#6036. 雅礼集训 2017 Day4. 编码

    老早以前的坑了 貌似好多地方都有这个题 因为每个串都只有一个问号,问号可取0可取1,这就是一个经典的2-SAT模型 但是直接做的话,边数是n2n^2级别的,不过因为是01串,可以用可持久化字典树优化建 ...

  7. 字典树andXOR*

    A.HDU 4825 你需要写一种数据结构: 往其中加入一个正整数: 找出一个正整数,使得该数与询问数的异或结果最大. \(n\le 10^5\) . 解 将数按二进制从高位到低位插入字典树. 查询时 ...

  8. POJ - 3764 The xor-longest Path(字典树性质)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个边权,现在问能否选择两个点,使得其间路径上的异或和最大 题目分析:直接求肯定是比较复杂的,我们可以转换一下题意,因为是一棵树,所以n个点肯定互 ...

  9. 可持久化3--可持久化01Trie

    01Trie 可持久化 01Trie 的方式和可持久化值域线段树的方式是相似的,只是以 01字典树 的方式来维护值域.一般用来解决异或相关的能够按位贪心的题目. 其实就是将可持久化线段树中的操作嫁接到 ...

最新文章

  1. python装饰设备_python装饰器
  2. 百度2016/2017秋招部分题目解析
  3. 甘特图 知乎_安利!拥有这5款甘特图工具,项目管理、生产排程轻松搞定!
  4. 删除windows换行符^M
  5. SORT,DELETE ADJACEN DUPLICATES FROM保留有效数据
  6. Java进阶:default方法说明
  7. java web怎么样_怎么样自学Java web?
  8. 每日干货丨C语言知识总结----循环结构
  9. 李洋疯狂C语言之选择排序
  10. CSS(一)sytle
  11. C#不登录电脑启动程序
  12. 转g代码教程_图深度学习入门教程(九)——图滤波神经网络模型
  13. Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c(07)
  14. 编译exe不弹窗口_详解matlab mbuild -setup找不到C++编译器解决方案
  15. window10 安装Java11 并可以和Java8进行自由切换
  16. 通用评估神经网络鲁棒性方法—CLEVER
  17. AI领域各个方向大牛博客汇总
  18. SLAM导航机器人零基础实战系列:(三)感知与大脑——5.机器人大脑嵌入式主板性能对比...
  19. c语言 宏do while,关于C语言宏定义 使用do{ xxxx }while()
  20. FPGA数字信号处理(十八)Quartus CIC IP核实现

热门文章

  1. 20应用统计考研复试要点(part11)--应用多元分析
  2. 掌握了这个方法,以后遇到bug不用再求人了!
  3. 什么是 SAP HANA XS JavaScript
  4. SAP 电商云 UI 持续集成里 workflow 触发条件一览
  5. SAP Spartacus 读取 Cart 的原理分析
  6. Linux Boot,Kernel 和 Service 介绍
  7. SAP Cloud for Customer(C4C)后台ABAP系统的System ID和client ID
  8. SAP Spartacus url里默认electronics-spa的由来
  9. rxjs里的Observable对象如何消费
  10. 我ABAP开发生涯中搜集的一些有意思的数据库表