高级打字机 (Tries)
Problem 1 高级打字机(type.cpp/c/pas)
【题目描述】
早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。
请为这种高级打字机设计一个程序,支持如下3种操作:
1.T x:在文章末尾打下一个小写字母x。(type操作)
2.U x:撤销最后的x次修改操作。(Undo操作)
(注意Query操作并不算修改操作)
3.Q x:询问当前文章中第x个字母并输出。(Query操作)
文章一开始可以视为空串。
【输入格式】
第1行:一个整数n,表示操作数量。
以下n行,每行一个命令。保证输入的命令合法。
【输出格式】
每行输出一个字母,表示Query操作的答案。
【样例输入】
7
T a
T b
T c
Q 2
U 2
T c
Q 2
【样例输出】
b
c
【数据范围】
对于40%的数据 n<=200;
对于100%的数据 n<=100000;保证Undo操作不会撤销Undo操作。
<高级挑战>
对于200%的数据 n<=100000;Undo操作可以撤销Undo操作。
<IOI挑战>
必须使用在线算法完成该题。
这题要用字典树(Tries)
还有msm(倍增算法)
另外 补充一点
char s[0] 或者 char
scanf("%s",s)
这句会存不下"\0"
因此会把正在循环的自变量i 变成 0
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<vector>
#include<cctype>
using namespace std;
#define MAXN (100000+10)
#define LOGMAXN (16+10)
int n,tot=0;
struct Tnode
{int deep,f[LOGMAXN];char edge;Tnode(){memset(f,0,sizeof(f));deep=-1;edge='\0';}Tnode(char _edge,int _fa,int _deep){memset(f,0,sizeof(f));f[0]=_fa;edge=_edge;deep=_deep; }int logdeep(){return int(trunc(log(deep)/log(2)));}
}node[MAXN];
int log2(int a)
{return int(trunc(log(a)/log(2)));
}
void msm(Tnode &a)
{int n=a.logdeep();
// if (n==1) return;for (int i=1;i<=n;i++){a.f[i]=node[a.f[i-1]].f[i-1];}
}
void type()
{char c;scanf("%s",&c);tot++;node[tot]=Tnode(c,tot-1,node[tot-1].deep+1);msm(node[tot]);
}void quere()
{int p;scanf("%d",&p);Tnode now=node[tot];p=now.deep+1-p; //第i's 祖先 while (p){int i=log2(p);p-=(1<<i);now=node[now.f[i]];}printf("%c\n",now.edge); }
void undo()
{int p;scanf("%d",&p);tot++;node[tot]=node[tot-1-p];
}
int main()
{freopen("type.in","r",stdin);freopen("type.out","w",stdout);scanf("%d",&n);node[0]=Tnode();for (int ii=1;ii<=n;ii++){
// printf("%d\n",ii);char s[10];
// printf("%d\n",ii);scanf("%s",s);
// printf("%d\n",ii);
// while(1);switch(s[0]){case 'T':type();break;case 'U':undo();break;case 'Q':quere();break; }}
// while (1);return 0;
}
高级打字机 (Tries)相关推荐
- 【搜索树】高级打字机(luogu 1383)
高级打字机 luogu 1383 题目大意: 有三种操作:添加一个字符(更改操作),撤回前iii步步更改操作(更改操作,可以撤回自己),输出某一位的字符,现在要按要求输出字符 原题: 题目描述 早苗入 ...
- [洛谷1383]高级打字机 题解
题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...
- 高级打字机【主席树】【滚动数组】【块状链表】
题目大意: 一个计算机支持一下三中操作: TT xx:在文章末尾打下一个小写字母xx. UU xx:撤销最后的xx次修改操作. QQ xx:询问当前文章中第xx个字母并输出. InputInput 7 ...
- 【Luogu】P1383高级打字机
可持久化线段树模板题之一. 权当温习主席树模板 #include<cstdio> #include<cstdlib> #include<cctype> #defin ...
- P1383 高级打字机
一道非常基础的可持久化数据结构题. 前置芝士 可持久化线段树:实现的方法主要是主席树. 具体做法 这个基本就是一个模板题了,记录一下每一个版本的字符串的长度,在修改的时候就只要在上一个版本后面加上一个 ...
- 【JZOJ3794】【洛谷P1383】高级打字机【主席树】
题目大意: 题目链接: 洛谷:https://www.luogu.org/problemnew/show/P1383 JZOJ:https://jzoj.net/senior/#main/show/3 ...
- P1383 高级打字机 *
Link 主席树 思路 用 size 数组表示当前子树节点个数,新加入节点时,若 s i z e ( l c ) = = m i d − l + 1 size(lc) == mid - l + 1 s ...
- Conclusion
/* 高中最后一个暑假 挺有意义的 考了一暑假的试 最后总结一下吧 一天一天来吧7.30 这一天的题有点变态啊 不过难题有难题的做法 T1斗地主 考试的时候打了0分 0分..... 原因好像是读入的格 ...
- 8.19noip模拟题
2017 8.19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas ...
最新文章
- 有这一篇机器学习全够了
- adb 由于目标计算机积极拒绝,无法连接
- python中的类属性和类方法_python面向对象之类属性和类方法的使用和实例
- 数据结构 -- 可重用模块的接口设计模板
- 中断方式下进行串口通讯的正确方法
- C++基础知识点整理
- 低功耗广域网:关键特性
- h5 右下角浮动按钮_Flutter 浮动按钮-FloatingActionButton的使用
- java Http请求工具类【post/get】
- 光学efl_关于光学设计使用以及理解
- Android 混淆规则
- 佳能Canon imageCLASS MF4830d 打印机驱动
- win10计算机共享在哪,快速共享电脑文件,win10的“就近共享”功能了解一下!...
- 子空间的投影矩阵推导过程及其性质
- JAVA中各种单位之间的转换
- python中char是什么意思_MySQL中char和varchar的区别是什么
- 《看聊天记录都学不会C语言?太菜了吧》(6)编程很难吗?差一点就学不会了呢!
- zjs-my-dary-20220113
- matlab的积分公式,玩转matlab之一维 gauss 数值积分公式及matlab源代码
- 《Swift4打造今日头条视频实战项目实战》最新