P1383 高级打字机

    • 18通过
    • 118提交
  • 题目提供者yeszy
  • 标签倍增图论高级数据结构福建省历届夏令营
  • 难度省选/NOI-

提交该题 讨论 题解 记录

最新讨论

  • 暂时没有讨论

题目描述

早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。

请为这种高级打字机设计一个程序,支持如下3种操作:

1.T x:在文章末尾打下一个小写字母x。(type操作)

2.U x:撤销最后的x次修改操作。(Undo操作)

(注意Query操作并不算修改操作)

3.Q x:询问当前文章中第x个字母并输出。(Query操作)

文章一开始可以视为空串。

输入输出格式

输入格式:

第1行:一个整数n,表示操作数量。

以下n行,每行一个命令。保证输入的命令合法。

输出格式:

每行输出一个字母,表示Query操作的答案。

输入输出样例

输入样例#1:

7
T a
T b
T c
Q 2
U 2
T c
Q 2
输出样例#1:

b
c

说明

【数据范围】

对于40%的数据 n<=200;

对于100%的数据 n<=100000;保证Undo操作不会撤销Undo操作。

<高级挑战>

对于200%的数据 n<=100000;Undo操作可以撤销Undo操作。

<IOI挑战>

必须使用在线算法完成该题。

50分代码(栈模拟):

#include<cstdio>
using namespace std;
#define N 51000
int top,T;
char st[N];
int main(){
scanf("%d",&T);
while(T--){
char c1[],c2[];int x;
scanf("%s",c1);
if(c1[]=='T'){
scanf("%s",c2);
st[++top]=c2[];
}
if(c1[]=='U'){
scanf("%d",&x);
top-=x;
}
if(c1[]=='Q'){
scanf("%d",&x);
printf("%c\n",st[x]);
}
}
return ;
}

题解:

因为Undo操作只能撤销Type操作,所以Undo x 实际上就是删除文章末尾x个字母。用一个栈即可解决(每个字母最多进出一次)。

<高级挑战>    (考虑到部分选手水平较高,故设此附加题)

本题虽为2012年IOI的题目,但只要使用离线算法,就成为只需noip级别编程水平的题目了。

以下声明一些定义:(对于此类题目以及各种可持久化数据结构的离线解法的思考很有帮助)

版本:接受第1--i个修改操作(包含Type和Undo)后的状态称为版本i。版本0为初始状态。

版本链:一般的数据结构题目只有各种修改命令(比如本题的Type操作),那么所有版本就会呈链状排列。

这种情况下只需要设计一个合理的数据结构依次执行操作即可。

版本树:Undo x撤销最近的x次修改操作,实际上就是当前版本还原为x次操作前的版本,换句话说,版本i = 版本i-x-1。

如图所示,所有版本呈树状排列,版本0为根。

读入所有操作并建树,对这颗版本树按欧拉序求出所有版本。上图中就是按0->1->4...4->1->0->2->3->2->0的顺序遍历,同样使用栈就能计算出所有的版本,然后在对应的版本上解决询问即可。

到此,就得到了时空复杂度均为O(n)的离线算法。

能解决这类题目的条件是:

1.允许使用离线算法,进而求出版本树,并允许把询问挂到树的节点上。

2.所有操作都是可逆的。只有所有操作都是可逆的,才能按欧拉序依次求出各版本。如本题的Type操作的逆操作就是弹出栈顶,Undo操作则根本不需要修改(Undo前后2个版本相同)。

相关题目:crisis 60% (2012 国家集训队hw2出题互测\卓亮)

<IOI挑战>

Trie+倍增法寻祖                                       O(nlogn)

各种可持久化数据结构:可持久化块状数组                O(nsqrtn)

可持久化跳表(与Trie解法相近) O(nlogn)

......

因超出noip范围不做更多展开。

AC代码(手写主席树):

#include<cstdio>
using namespace std;
const int R=1e5,N=(R+)*;
int n,m,now,sz,root[R+],ls[N],rs[N],len[N];
char s[N];
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void insert(int &k,int last,int l,int r,int pos,int c){
k=++sz;
if(l==r){s[k]=c;return ;}
ls[k]=ls[last];
rs[k]=rs[last];
int mid=l+r>>;
if(pos<=mid) insert(ls[k],ls[last],l,mid,pos,c);
else insert(rs[k],rs[last],mid+,r,pos,c);
}
void query(int &k,int last,int l,int r,int pos){
if(l==r){putchar(s[k]);putchar('\n');return ;}
int mid=l+r>>;
if(pos<=mid) query(ls[k],ls[last],l,mid,pos);
else query(rs[k],rs[last],mid+,r,pos);
}
int main(){
n=read();
for(int i=,x;i<=n;i++){
char op=,ch=;
for(;op<'A'||op>'Z';op=getchar());
if(op=='T'){
for(;ch<'a'||ch>'z';ch=getchar());
now++;
len[now]=len[now-]+;
insert(root[now],root[now-],,R,len[now],ch);
}
else if(op=='U'){
x=read();
now++;
root[now]=root[now-x-];
len[now]=len[now-x-];
}
else x=read(),query(root[now],root[now-],,R,x);
}
return ;
}

AC代码(rope标程):

#include<cstdio>
#include<iostream>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
const int maxn=1e5+;
rope<char> *his[maxn];
int n,m;
inline char getC(){
for(register char ch=getchar();;ch=getchar()) if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')) return ch;
}
inline int getint(){
register int x=,f=;
register char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int main(){
n=getint();
his[]=new rope<char>();
for(int i=;i<=n;i++){
char opt=getC();
if(opt=='T'){
m++;
his[m]=new rope<char>(*his[m-]);//就是这一句!它可以实现O(1)的拷贝历史版本,由于rope的底层是平衡树,copy时copy根节点就行了;用它就可以轻松实现可持久化数组
char x=getC();
his[m]->push_back(x);
}else if(opt=='U'){
int x=getint();
m++;
his[m]=new rope<char>(*his[m-x-]); }else if(opt=='Q'){
int x=getint()-;
putchar(his[m]->at(x));
putchar('\n');
}
}
return ;
}

洛谷 P1383 高级打字机==codevs 3333 高级打字机的更多相关文章

  1. 洛谷P1395 会议(CODEVS.3029.设置位置)(求树的重心)

    To 洛谷.1395 会议 To CODEVS.3029 设置位置 题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会 ...

  2. codevs 3333 高级打字机

    3333 高级打字机   题目描述 Description 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作 ...

  3. 洛谷P1432 倒水问题(CODEVS.1226)

    To 洛谷.1432 倒水问题 题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were co ...

  4. 洛谷 P2155 BZOJ 2186 codevs 2301 [SDOI2008]沙拉公主的困惑

    题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...

  5. 洛谷P1650赛马与codevs 2181 田忌赛马

    洛谷P1650 赛马 题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负 ...

  6. 洛谷 P1383 codevs 3333 高级打字机

    题目描述 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(t ...

  7. 【洛谷P1383 高级打字机】

    题目描述 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(t ...

  8. 洛谷 P1262 间谍网络==Codevs 4093 EZ的间谍网络

    4093 EZ的间谍网络 时间限制: 10 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B ...

  9. 洛谷——P1002 过河卒||codevs——T1010 过河卒

    https://www.luogu.org/problem/show?pid=1002#sub||http://codevs.cn/problem/1010/ 题目描述 棋盘上A点有一个过河卒,需要走 ...

随机推荐

  1. python Matplotlib 系列教程(三)——绘制直方图和条形图

    在本章节我们将学习如何绘制条形图和直方图 条形图与直方图的区别:首先,条形图是用条形的长度表示各类别频数的多少,其宽度(表示类别)则是固定的: 直方图是用面积表示各组频数的多少,矩形的高度表示每一组的 ...

  2. HDU1401 Solitaire

    题目描述:8×8的棋盘上有4个棋子,棋子的运动方法如下:1.如果其上/下/左/右一格没有棋子,则可以去;2.如果其上/下/左/右一格有棋子,而且沿原方向再跳一步没有,则可以去. 给出初始结束位置,问8 ...

  3. [Python3网络爬虫开发实战] 4.1-使用XPath

    XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索. 所以在做爬虫时,我们完全 ...

  4. c++基础_杨辉三角形

    #include <iostream> using namespace std; int main(){ int n; cin>>n; ][]; ;i<n;i++){ a ...

  5. Spider-Python爬虫之XPath 教程

    原文链接:https://www.runoob.com/xpath/xpath-syntax.html XPath 术语 XPath 节点 七种类型:在 XPath 中,有七种类型的节点:元素.属性. ...

  6. 关于Filter中ServletRequest和ServletResponse强转HttpServletRequest和HttpServletResponse安全问题(向下转型一定不安全吗?)

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOE ...

  7. Directory获取方式

    1) FSDirectory.open FSDirectory.open()会以最合适的方式来获取一个Directory对象. 2) RAMDirectory 可以将磁盘中的索引加载到内存中,访问速度 ...

  8. 牛客网暑期ACM多校训练营(第二场)B discount

    链接:https://www.nowcoder.com/acm/contest/140/B来源:牛客网 题目描述 White Rabbit wants to buy some drinks from ...

  9. hdu 4770 状压+枚举

    /* 长记性了,以后对大数组初始化要注意了!140ms 原来是对vis数组进行每次初始化,每次初始化要200*200的复杂度 一直超时,发现没必要这样,直接标记点就行了,只需要一个15的数组用来标记, ...

  10. java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.views.login_jsp

    背景:SpringBoot的项目配置了对jsp的支持,走控制器就报这个错误.相关配置如下: <!-- JSP BEGIN --> <dependency> <groupI ...