一道非常基础的可持久化数据结构题.

前置芝士

  1. 可持久化线段树:实现的方法主要是主席树.

具体做法

这个基本就是一个模板题了,记录一下每一个版本的字符串的长度,在修改的时候就只要在上一个版本后面加上一个字符,撤销操作就之久回到x个版本前就好了.用主席树维护,每次修改和查询都是log⁡2N\log_2Nlog2​N的,且可以做到在线.

代码

#include<bits/stdc++.h>
#define RAP(i,first,last) for(int i=first;i<=last;++i)
//主席树标准define
#define LSON tree[now].lson
#define RSON tree[now].rson
#define MIDDLE ((left+right)>>1)
#define LEFT LSON,left,MIDDLE
#define RIGHT RSON,MIDDLE+1,right
#define NOW now_left,now_right
#define NEW_LSON tree[new_tree].lson
#define NEW_RSON tree[new_tree].rson
using namespace std;
const int maxM=1e5+7;
int N=1e5,M;
int arr[maxM],sor[maxM];
struct Tree
{int sum,lson,rson;//动态开点,因为是单点查询,所以不需要合并//习惯性得用来sum,问题不大
}tree[maxM*32];
int cnt=0;
void UpData(int &new_tree,int num,int ch,int now,int left=1,int right=N)//在now这颗树中修改,修改后的树存在new_tree中
{if(num<left||right<num)//如果不在范围内就直接用原来树的值{new_tree=now;return;}new_tree=++cnt;//新建一个节点if(left==right)//叶节点直接修改{tree[new_tree].sum=ch;return;}//修改左右子树UpData(NEW_LSON,num,ch,LEFT);UpData(NEW_RSON,num,ch,RIGHT);
}
int Query(int k,int now,int left=1,int right=N)//查询和普通的线段树差不多
{if(k<left||right<k)return 0;//不在范围内返回0if(left==right)//到叶节点就直接返回字母{return tree[now].sum;}return Query(k,LEFT)+Query(k,RIGHT);
}
int root[maxM];//记录每个版本的根节点
int len[maxM];//记录每个版本中的字符串长度
int main()
{cin>>M;char ch;int x;char add;int tot=0;//记录当前的版本编号RAP(i,1,M){cin>>ch;if(ch=='T'){++tot;cin>>add;len[tot]=len[tot-1]+1;UpData(root[tot],len[tot],add,root[tot-1]);//在上一个版本后面加上一个字母}if(ch=='U'){++tot;cin>>x;root[tot]=root[tot-x-1];//返回到x个版本前,信息只要直接赋值len[tot]=len[tot-x-1];}if(ch=='Q'){cin>>x;printf("%c\n",Query(x,root[tot]));//查询字母}}return 0;//完结撒花
}

P1383 高级打字机相关推荐

  1. 【Luogu】P1383高级打字机

    可持久化线段树模板题之一. 权当温习主席树模板 #include<cstdio> #include<cstdlib> #include<cctype> #defin ...

  2. P1383 高级打字机 *

    Link 主席树 思路 用 size 数组表示当前子树节点个数,新加入节点时,若 s i z e ( l c ) = = m i d − l + 1 size(lc) == mid - l + 1 s ...

  3. 【搜索树】高级打字机(luogu 1383)

    高级打字机 luogu 1383 题目大意: 有三种操作:添加一个字符(更改操作),撤回前iii步步更改操作(更改操作,可以撤回自己),输出某一位的字符,现在要按要求输出字符 原题: 题目描述 早苗入 ...

  4. 高级打字机 (Tries)

    Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...

  5. 【JZOJ3794】【洛谷P1383】高级打字机【主席树】

    题目大意: 题目链接: 洛谷:https://www.luogu.org/problemnew/show/P1383 JZOJ:https://jzoj.net/senior/#main/show/3 ...

  6. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  7. 高级打字机【主席树】【滚动数组】【块状链表】

    题目大意: 一个计算机支持一下三中操作: TT xx:在文章末尾打下一个小写字母xx. UU xx:撤销最后的xx次修改操作. QQ xx:询问当前文章中第xx个字母并输出. InputInput 7 ...

  8. Conclusion

    /* 高中最后一个暑假 挺有意义的 考了一暑假的试 最后总结一下吧 一天一天来吧7.30 这一天的题有点变态啊 不过难题有难题的做法 T1斗地主 考试的时候打了0分 0分..... 原因好像是读入的格 ...

  9. 8.19noip模拟题

      2017 8.19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas ...

最新文章

  1. P2221 [HAOI2012]高速公路
  2. OAM 创始团队:揭秘 OAM Kubernetes 实现核心原理
  3. SQL查询除了某一列的其他列
  4. c++ template(4)基本技巧
  5. Eclipse的Mockito模板
  6. linux华为路由器模拟器,华为路由器模拟器与实验内容.doc
  7. 【学习笔记】路由算法与路由协议:RIP协议与距离向量算法、OSPF协议与链路状态算法、BGP协议
  8. php登陆+链接+验证,php+ajax验证登录跳转登录的实现方法
  9. sqlserver中分组按逗号连接
  10. 蓝桥杯ALGO-147算法训练 4-3水仙花数
  11. RH850 MPU 实现介绍
  12. app软件怎么申请软件著作权?
  13. 项目管理知识体系指南(四)项目管理范围
  14. mysql8 update语句 where块的in方法内子查询不报错
  15. android bks证书生成方式
  16. 关于瞬时功率的无功功率和有功功率,在不同坐标系下的验证
  17. 网易云对象存储获取私有对象下载链接打不开的问题
  18. idea在mac上面操作的快捷键
  19. 计算机玩游戏不能全屏,电脑游戏不能全屏怎么办 电脑游戏不能全屏的解决方法...
  20. 如何在rhel4上禁用不需要的相关服务

热门文章

  1. openjudge 7920 统计单词数
  2. 批量缩小图片大小的方法
  3. batchupdate写法_mybatis执行批量插入insert和批量更新update
  4. mdin偏移_dif_input.c 源代码在线查看 - C8051F系列单片机开发与C语言编程 非常好的东西 资源下载 虫虫电子下载站...
  5. 大一网页设计期末大作业,HTML+CSS静态网站
  6. h5页面在新版微信iOS 端出现底部白色导航条
  7. 不同公司系统的对接心得
  8. mysql查询最轻的零件_数据库复习题
  9. 计算机如何回到桌面,电脑系统教程:win10怎么返回到桌面状态
  10. 2021年中国移动互联网行业发展现状及行业发展趋势分析[图]