1507: [NOI2003]Editor

Time Limit: 5 Sec  Memory Limit: 162 MB

Submit: 4129  Solved: 1660

[Submit][Status][Discuss]

Description

Input

输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作。其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它们(如果难以理解这句话,可以参考样例)。 除了回车符之外,输入文件的所有字符的ASCII码都在闭区间[32, 126]内。且行尾没有空格。 这里我们有如下假定:  MOVE操作不超过50000个,INSERT和DELETE操作的总个数不超过4000,PREV和NEXT操作的总个数不超过200000。
 所有INSERT插入的字符数之和不超过2M(1M=1024*1024),正确的输出文件长度不超过3M字节。  DELETE操作和GET操作执行时光标后必然有足够的字符。MOVE、PREV、NEXT操作必然不会试图把光标移动到非法位置。  输入文件没有错误。 对C++选手的提示:经测试,最大的测试数据使用fstream进行输入有可能会比使用stdio慢约1秒。

Output

输出文件editor.out的每行依次对应输入文件中每条GET指令的输出。

Sample Input

15

Insert 26

abcdefghijklmnop

qrstuv wxy

Move 15

Delete 11

Move 5

Insert 1

^

Next

Insert 1

_

Next

Next

Insert 4

.\/.

Get 4

Prev

Insert 1

^

Move 0

Get 22

Sample Output

.\/.

abcde^_^f.\/.ghijklmno

和之前写过的一道省选题几乎一样【少了个翻转,简单些】

splay水过

【附上TLE,MLE,RE,WA,AC崩溃路程QAQ】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define isr(u) (e[e[u].f].ch[1] == u)
#define ls e[u].ch[0]
#define rs e[u].ch[1]
#define sizl(u) (e[e[u].ch[0]].siz)
using namespace std;
const int maxn = 1000005,maxm = 3000005,INF = 1000000000;
inline int RD(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
return out * flag;
}
char cmd[105],s[maxm];
int siz = 0,pos = 0,rt = 0;
struct node{char c; int ch[2],f,siz;}e[maxm];
inline void pup(int u) {e[u].siz = sizl(u) + 1 + e[rs].siz;}
inline void spin(int u){
int s = isr(u),fa = e[u].f;
e[u].f = e[fa].f; if (e[fa].f) e[e[fa].f].ch[isr(fa)] = u;
e[fa].ch[s] = e[u].ch[s ^ 1]; if (e[u].ch[s ^ 1]) e[e[u].ch[s ^ 1]].f = fa;
e[fa].f = u; e[u].ch[s ^ 1] = fa;
pup(fa); pup(u);
}
inline void splay(int u,int v = 0){
for (; e[u].f != v; spin(u))
if (e[e[u].f].f != v) spin((isr(u) ^ isr(e[u].f)) ? u : e[u].f);
if (!v) rt = u;
}
inline void Kth(int k,int p){
int u = rt;
while (true){
if (sizl(u) >= k) u = ls;
else if (sizl(u) + 1 == k) {splay(u,p);break;}
else k -= sizl(u) + 1,u = rs;
}
}
int build(int fa,int l,int r){
if (l > r) return 0;
int u = ++siz; e[u].f = fa; e[u].siz = 1;
int mid = l + r >> 1; e[u].c = s[mid];
if (l == r) return u;
e[u].ch[0] = build(u,l,mid - 1);
e[u].ch[1] = build(u,mid + 1,r);
pup(u);
return u;
}
void Insert(){
int n = RD(); char c;
Kth(pos + 1,0); Kth(pos + 2,rt);
for (int i = 1; i <= n; i++){c = getchar(); while (c < 32 || c > 126) c = getchar(); s[i] = c;}
e[e[rt].ch[1]].ch[0] = build(e[rt].ch[1],1,n);
pup(e[rt].ch[1]); pup(rt);
}
void Print(int u){
if (!u) return;
Print(ls); printf("%c",e[u].c); Print(rs);
}
void Delete(){
int n = RD();
Kth(pos + 1,0); Kth(pos + n + 2,rt);
e[e[rt].ch[1]].ch[0] = 0;
pup(e[rt].ch[1]); pup(rt);
}
void Get(){
int n = RD();
Kth(pos + 1,0); Kth(pos + n + 2,rt);
Print(e[e[rt].ch[1]].ch[0]); printf("\n");
}
int main(){
//freopen("out.txt","w",stdout);
e[siz = 2].f = 1; e[rt = 1].ch[1] = siz; e[rt].siz = 2; e[siz].siz = 1;
int T = RD();
while (T--){
scanf("%s",cmd);
switch(cmd[0]){
case 'M':pos = RD();break;
case 'I':Insert();break;
case 'D':Delete();break;
case 'G':Get();break;
case 'P':pos--;break;
case 'N':pos++;break;
default:break;
}
}
return 0;
}

BZOJ1507 [NOI2003]Editor 【splay】的更多相关文章

  1. 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay

    [bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...

  2. 【BZOJ1861】【splay】Book 书架

    Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿 ...

  3. 【POJ3481】【splay】Double Queue

    Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest ...

  4. HYSBZ1588 营业额统计【Splay】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4366582.html   ---by 墨染之樱花 [题目链接]http://www.lydsy ...

  5. 【Splay】例题

    营业额统计 题目背景 HNOI2002 DAY2 T2 题目描述 Tiger 最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger 拿出了公司 ...

  6. [luogu3391][bzoj3223]文艺平衡树【splay】

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 分析 ...

  7. 【BZOJ】1507: [NOI2003]Editor(Splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1507 当练splay模板了,发现wjmzbmr的splay写得异常简介,学习了.orzzzzzzzz ...

  8. [BZOJ1507] [NOI2003] Editor (splay)

    Description Input 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它 ...

  9. 【洛谷】3960:列队【Splay】

    P3960 列队 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为  ...

随机推荐

  1. H5-基础-day01

    类选择器和ID选择器   相同点:可以应用于任何元素不同点: 1.ID选择器只能在文档中使用一次.与类选择器不同,在一个HTML文档中,ID选择器只能使用一次,而且仅一次.而类选择器可以使用多次. 2 ...

  2. 「日常训练」Caterpillar(POJ-3310)

    题意与分析 一条很有趣的题目.给一个无向图,问它是否无环,且可以在上面找到一条线,使所有的顶点要么在线上要么不在线上但在与线相连的边上. 那么首先要确定所有点联系在一起.这个可以同判环一起处理:如果建 ...

  3. 分布式部署Apache-Jmeter粗略流程

    注意事项 Windows版和Mac版Jmeter可互相通信 确认被部署的机器安装有JDK并已配置好环境变量 Controller安装 1. 安装Jmeter,监视插件JMeterPlugins-Sta ...

  4. Monkey用真机做测试的步骤

    1 必备条件 1) 手机需要先获取root权限: 2) 手机和电脑相连(电脑可以访问手机里面的文件) 2  操作步骤 1) 使用adb devices 命令查看电脑手机是否相连: 下图表示手机已连上电 ...

  5. 用Python实现一个端口扫描,只需简单几步就好

    一.常见端口扫描的原理 0.秘密扫描 秘密扫描是一种不被审计工具所检测的扫描技术. 它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己. 秘密扫描能躲避IDS.防火墙.包过滤器 ...

  6. python计算工资个税

    # -*- coding: utf-8 -*- total = int(input("税前总计:")) #公积金10% Gongjijin = total * 0.1 print( ...

  7. NProgress.js加载进度插件的简单实用方法

    NProgress.js 说明: NProgress是基于jquery的,且版本要 >1.8 下载地址: https://github.com/rstacruz/nprogress API: N ...

  8. android AndroidManifest.xml uses-feature 详解

    如果你是一个Android用户,而且你有一个老旧的安装有android 1.5 的android设备,你可 能会注意到一些高版本的应用没有在手机上的Android Market 中显示.这必定是应用使 ...

  9. LintCode-140.快速幂

    快速幂 计算an % b,其中a,b和n都是32位的整数. 样例 例如 231 % 3 = 2 例如 1001000 % 1000 = 0 挑战 O(logn) 标签 分治法 code class S ...

  10. MFC动态创建控件及其消息响应函数

    这几天专门调研了一下MFC中如何动态创建控件及其消息响应函数. 参考帖子如下: (1)http://topic.csdn.net/u/20101204/13/5f1b1e70-2f1c-4205-ba ...