AHOI2006文本编辑器editor
1269: [AHOI2006]文本编辑器editor
Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1885  Solved: 683
[Submit][Status]
Description
这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器。你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:  
  文本:由0个或多个字符构成的序列。这些字符的ASCII码在闭区间[32, 126]内,也就是说,这些字符均为可见字符或空格。光标:在一段文本中用于指示位置的标记,可以位于文本的第一个字符之前,文本的最后一个字符之后或文本的某两个相邻字符之间。文本编辑器:为一个可以对一段文本和该文本中的一个光标进行如下七条操作的程序。如果这段文本为空,我们就说这个文本编辑器是空的。 编写一个程序: 建立一个空的文本编辑器。 从输入文件中读入一些操作指令并执行。 对所有执行过的GET操作,将指定的内容写入输出文件。
 文本:由0个或多个字符构成的序列。这些字符的ASCII码在闭区间[32, 126]内,也就是说,这些字符均为可见字符或空格。光标:在一段文本中用于指示位置的标记,可以位于文本的第一个字符之前,文本的最后一个字符之后或文本的某两个相邻字符之间。文本编辑器:为一个可以对一段文本和该文本中的一个光标进行如下七条操作的程序。如果这段文本为空,我们就说这个文本编辑器是空的。 编写一个程序: 建立一个空的文本编辑器。 从输入文件中读入一些操作指令并执行。 对所有执行过的GET操作,将指定的内容写入输出文件。
Input
输入文件中第一行是指令条数N,以下是需要执行的N个操作。除了回车符之外,输入文件的所有字符的ASCII码都在闭区间[32, 126]内。且行尾没有空格。
Output
依次对应输入文件中每条GET指令的输出,不得有任何多余的字符。
Sample Input
Insert 13
Balanced eert
Move 2
Delete 5
Next
Insert 7
editor
Move 0
Get
Move 11
Rotate 4
Get
Sample Output
t
HINT
对输入数据我们有如下假定: MOVE操作不超过50 000个,INSERT、DELETE和ROTATE操作作的总个数不超过6 000,GET操作不超过20 000个,PREV和NEXT操作的总个数不超过20 000。 所有INSERT插入的字符数之和不超过2M(1M=1 024*1 024)。 DELETE操作、ROTATE操作和GET操作执行时光标后必然有足够的字符。MOVE、PREV、NEXT操作不会把光标移动到非法位置。 输入文件没有错误。
Source
题解:
和NOI2003的editor差不多,只是多了个rotate操作,对于splay操作,只需要在 find 时先做一次 pushdown即可
这次没有TLE,真爽。。。
代码:
 {$inline on}
 {$M 1000000000,0,maxlongint}
 const maxn=+;
 var s,fa:array[..maxn] of longint;
     rev:array[..maxn] of boolean;
     v:array[..maxn] of char;
     c:array[..maxn,..] of longint;
     i,j,n,m,x,y,z,tot,rt,now,l,r:longint;
     ch:char;
     st,st2:ansistring;
     procedure swap(var x,y:longint);inline;
      var t:longint;
      begin
       t:=x;x:=y;y:=t;
      end;
 procedure pushup(x:longint);inline;
  begin
   s[x]:=s[c[x,]]+s[c[x,]]+;
  end;
 procedure pushdown(x:longint);inline;
  var l,r:longint;
  begin
   l:=c[x,];r:=c[x,];
   if rev[x] then
    begin
     swap(c[x,],c[x,]);
     rev[l]:=not(rev[l]);
     rev[r]:=not(rev[r]);
     rev[x]:=false;
    end;
  end;
 procedure rotate(x:longint;var k:longint);inline;
  var y,z,l,r:longint;
  begin
   y:=fa[x];z:=fa[y];
   l:=ord(c[y,]=x);r:=l xor ;
   if y=k then k:=x else c[z,ord(c[z,]=y)]:=x;
   fa[x]:=z;fa[y]:=x;fa[c[x,r]]:=y;
   c[y,l]:=c[x,r];c[x,r]:=y;
   pushup(y);pushup(x);
  end;
 procedure splay(x:longint;var k:longint);inline;
  var y,z:longint;
  begin
   while x<>k do
    begin
     y:=fa[x];z:=fa[y];
     if y<>k then
      if (c[z,]=y) xor (c[y,]=x) then rotate(x,k)
      else rotate(y,k);
     rotate(x,k);
    end;
  end;
 function find(x,rank:longint):longint;inline;
  var l,r:longint;
  begin
   pushdown(x);
   l:=c[x,];r:=c[x,];
   if s[l]+=rank then exit(x)
   else if s[l]>=rank then exit(find(l,rank))
   else exit(find(r,rank-s[l]-));
  end;
 procedure main;
  begin
   readln(n);
   l:=maxn-+;r:=maxn-+;
   rt:=l;
   c[l,]:=r;fa[r]:=l;s[l]:=;s[r]:=;
   now:=;tot:=;
   for i:= to n do
    begin
     read(ch);
     case ch of
     'P':begin
         readln;
         dec(now);
         end;
     'N':begin
         readln;
         inc(now);
         end;
     'M':begin
         while ch<>' ' do read(ch);readln(x);
         now:=x+;
         end;
     'I':begin
         while ch<>' ' do read(ch);readln(m);
         readln(st);while length(st)<m do begin readln(st2);st:=st+st2;end;
         for j:= to m do begin inc(tot);fa[tot]:=tot-;v[tot]:=st[j];s[tot]:=m-j+;c[tot,]:=;if j<>m then c[tot,]:=tot+ else c[tot,]:=;end;
         x:=find(rt,now);y:=find(rt,now+);
         splay(x,rt);splay(y,c[x,]);
         c[y,]:=tot-m+;fa[tot-m+]:=y;
         pushup(y);pushup(x);
         end;
     'D':begin
         while ch<>' ' do read(ch);readln(m);
         x:=find(rt,now);y:=find(rt,now+m+);
         splay(x,rt);splay(y,c[x,]);
         z:=c[y,];fa[z]:=;c[y,]:=;
         pushup(y);pushup(x);
         end;
     'R':begin
         while ch<>' ' do read(ch);readln(m);
         x:=find(rt,now);y:=find(rt,now+m+);
         splay(x,rt);splay(y,c[x,]);
         z:=c[y,];
         rev[z]:=not(rev[z]);
         end;
     'G':begin
         readln;
         writeln(v[find(rt,now+)]);
         end;
     end;
    end;
  end;
 begin
   assign(input,'input.txt');assign(output,'output.txt');
   reset(input);rewrite(output);
   main;
   close(input);close(output);
 end.                                           
AHOI2006文本编辑器editor的更多相关文章
- BZOJ 1269: [AHOI2006]文本编辑器editor( splay )
		splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ... 
- BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor
		BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor 题意: 分析: splay模拟即可 注意1507的读入格式 ... 
- BZOJ  1269: [AHOI2006]文本编辑器editor (splay tree)
		1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1213 Solved: 454[Submit ... 
- 【BZOJ1269/1507】[AHOI2006]文本编辑器editor Splay
		[BZOJ1269][AHOI2006]文本编辑器editor Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目 ... 
- 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor  Splay
		[bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ... 
- BZOJ1269 [AHOI2006]文本编辑器editor  【82行splay】
		1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4633 Solved: 1782 [Sub ... 
- [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)
		Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义: 文本:由0个或 ... 
- Bzoj1269 [AHOI2006]文本编辑器editor
		Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3678 Solved: 1380 Description 这些日子,可可不和卡卡一起玩了,原来可可正 ... 
- 【BZOJ】1269: [AHOI2006]文本编辑器editor(Splay)
		http://www.lydsy.com/JudgeOnline/problem.php?id=1269 这题RE2次啊,好不爽啊,我一直以为是splay的问题,其实是数组开小了......(我老犯这 ... 
随机推荐
- web相关
			1. html 和 htm 的区别 如果一个网站有index.html和index.htm 默认情况下优先访问.html htm是为了兼容之前dos系统的命名规范. 2. http1.0短连接 htt ... 
- asp:时间的计算
			DataTime dt = new DataTime();//dt为时间DataTime对象 dt.ToString();//2005-11-5 13:47:04 dt.AddYears(1).ToS ... 
- .net 安卓IOS跨平台des加解密双向的(可以互相加解密)
			#region 跨平台加解密(c# 安卓 IOS) // public static string sKey = "12345678"; // /// // /// 解密 // / ... 
- ECMA5.1中关于encodeURI,decodeURI 和encodeComponentURI,decodeComponentURI的区别
			The encodeURI and decodeURI functions are intended to work with complete URIs; theyassume that any r ... 
- centOS 6.4  mysql安装
			1 直接安装 yum install mysql mysql-server 2 启动mysql /usr/bin/mysqld_safe --user=mysql & 启动时,如果出现Can' ... 
- leetcode problem 11   Container With Most Water
			Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ... 
- jQuery 快速入门教程
			内容目录 jQuery 入门 什么是jQuery 如何使用jQuery jQuery的运行原理 如何选择jQuery版本 ready() 准备就绪时执行代码 jQuery 核心:选取元素 使用jQue ... 
- ubuntu 在XP下硬盘安装
			以下选择在XP下用 grub4dos 安装 ubuntu 12.04版本 需要下载两个文件:一个是grub4dos,另一个是 ubutuntu 镜像文件 grub4dos下载地址:http://dow ... 
- 入门2:PHP相关的名词解释
			/**宝宝我英语不好,后面注释拼音 请见谅**/ 1.Linux 开源的操作系统,在服务器端用户数量非常大,很多服务器都是使用Linux系统运行的. 相对windows系统来说具有非常完善的用户权限系 ... 
- Objective-C中的const ,extern,static
			一.const 1>对于const,记住关键的一点,它只是修饰右边的变量. 例如: - (void)viewDidLoad { [super viewDidLoad]; // const两种用法 ... 
