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:

  1. 7
  2. T a
  3. T b
  4. T c
  5. Q 2
  6. U 2
  7. T c
  8. Q 2
输出样例#1:

  1. b
  2. c

说明

【数据范围】

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

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

<高级挑战>

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

<IOI挑战>

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

50分代码(栈模拟):

  1. #include<cstdio>
  2. using namespace std;
  3. #define N 51000
  4. int top,T;
  5. char st[N];
  6. int main(){
  7. scanf("%d",&T);
  8. while(T--){
  9. char c1[],c2[];int x;
  10. scanf("%s",c1);
  11. if(c1[]=='T'){
  12. scanf("%s",c2);
  13. st[++top]=c2[];
  14. }
  15. if(c1[]=='U'){
  16. scanf("%d",&x);
  17. top-=x;
  18. }
  19. if(c1[]=='Q'){
  20. scanf("%d",&x);
  21. printf("%c\n",st[x]);
  22. }
  23. }
  24. return ;
  25. }

题解:

因为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代码(手写主席树):

  1. #include<cstdio>
  2. using namespace std;
  3. const int R=1e5,N=(R+)*;
  4. int n,m,now,sz,root[R+],ls[N],rs[N],len[N];
  5. char s[N];
  6. inline int read(){
  7. int x=,f=;char ch=getchar();
  8. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  9. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  10. return x*f;
  11. }
  12. void insert(int &k,int last,int l,int r,int pos,int c){
  13. k=++sz;
  14. if(l==r){s[k]=c;return ;}
  15. ls[k]=ls[last];
  16. rs[k]=rs[last];
  17. int mid=l+r>>;
  18. if(pos<=mid) insert(ls[k],ls[last],l,mid,pos,c);
  19. else insert(rs[k],rs[last],mid+,r,pos,c);
  20. }
  21. void query(int &k,int last,int l,int r,int pos){
  22. if(l==r){putchar(s[k]);putchar('\n');return ;}
  23. int mid=l+r>>;
  24. if(pos<=mid) query(ls[k],ls[last],l,mid,pos);
  25. else query(rs[k],rs[last],mid+,r,pos);
  26. }
  27. int main(){
  28. n=read();
  29. for(int i=,x;i<=n;i++){
  30. char op=,ch=;
  31. for(;op<'A'||op>'Z';op=getchar());
  32. if(op=='T'){
  33. for(;ch<'a'||ch>'z';ch=getchar());
  34. now++;
  35. len[now]=len[now-]+;
  36. insert(root[now],root[now-],,R,len[now],ch);
  37. }
  38. else if(op=='U'){
  39. x=read();
  40. now++;
  41. root[now]=root[now-x-];
  42. len[now]=len[now-x-];
  43. }
  44. else x=read(),query(root[now],root[now-],,R,x);
  45. }
  46. return ;
  47. }

AC代码(rope标程):

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<ext/rope>
  4. using namespace std;
  5. using namespace __gnu_cxx;
  6. const int maxn=1e5+;
  7. rope<char> *his[maxn];
  8. int n,m;
  9. inline char getC(){
  10. for(register char ch=getchar();;ch=getchar()) if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')) return ch;
  11. }
  12. inline int getint(){
  13. register int x=,f=;
  14. register char ch=getchar();
  15. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  16. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  17. return x*f;
  18. }
  19. int main(){
  20. n=getint();
  21. his[]=new rope<char>();
  22. for(int i=;i<=n;i++){
  23. char opt=getC();
  24. if(opt=='T'){
  25. m++;
  26. his[m]=new rope<char>(*his[m-]);//就是这一句!它可以实现O(1)的拷贝历史版本,由于rope的底层是平衡树,copy时copy根节点就行了;用它就可以轻松实现可持久化数组
  27. char x=getC();
  28. his[m]->push_back(x);
  29. }else if(opt=='U'){
  30. int x=getint();
  31. m++;
  32. his[m]=new rope<char>(*his[m-x-]);
  33.  
  34. }else if(opt=='Q'){
  35. int x=getint()-;
  36. putchar(his[m]->at(x));
  37. putchar('\n');
  38. }
  39. }
  40. return ;
  41. }

洛谷 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. laravel-admin常见错误处理

    php artisan key:generate 新的laravle会有密钥不存在的问题,这时候我们执行这句话就可以生成秘钥了

  2. C# Word 类库

    C# Word 类库 2009-08-06 22:10 14292人阅读 评论(11) 收藏 举报 c#objectstring文档microsoftexcel using System;using ...

  3. viewstate 与 session 区别

    Session存在于服务器端可以跨页面.耗费服务器资源.ViewState载体是页面文件,消耗带宽. EG: viewstate是存储在客户端的隐藏信息,当服务器接受请求回传时可以将viewstate ...

  4. POJ 1149 PIGS 建图,最大流

    题意: 你m个猪圈以及每个猪圈里原来有多少头猪,先后给你n个人,每个人能打开某一些猪圈并且他们最多想买Ki头猪,在每一个人买完后能将打开的猪圈中的猪顺意分配在这次打开猪圈里,在下一个人来之前 已打开的 ...

  5. uLua-案例学习-API

    LuaState.Start()初始化吧 LuaState.AddSearchPath(string fullPath)增加搜索路径,这样在执行lua文件时就不需要输入全路径,类似环境变量path. ...

  6. HashMap、ConcurrentHashMap以及HashTable(面试向)

    ---->HashMap 在java1.7中,hashmap的数据结构是基于数组+链表的结构,即我们比较熟悉的Entry数组,其包含的(key-value)键值对的形式.在多线程环境下,Hash ...

  7. JS 实现全屏预览 F11功能

    老是不通过,没办法,只能是重新发布了,反正我就是杠上了,大大小小写过很多前端特效,当然也经常在网上copy或者修改人家的代码,我觉得也挺好的,为什么?!因为我想这样,你能怎么办,打我?少废话,直接上代 ...

  8. PHP 处理接口保证数据安全性

    原地址:http://blog.csdn.net/lhbeggar/article/details/46377653 php做APP接口时,如何保证接口的安全性? 1.当用户登录APP时,使用http ...

  9. 集训第六周 数学概念与方法 数论 筛素数 H题

    Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识.  问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“ ...

  10. phtyon,通过while循环简单的用户名和密码登录

    _username='zhangxin' _password='abc123' _username1='zhaopeng' _password1='abc1234' _username2=" ...