练手QAQ

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string> using namespace std; void setIO(const string& a) {
freopen((a+".in").c_str(), "r", stdin);
freopen((a+".out").c_str(), "w", stdout);
} struct Node* null; const int N = * * + ; struct Node {
char v;
int sz;
Node* ch[]; Node(char v = ) : v(v) {
ch[] = ch[] = null;
sz = ;
} void maintain() {
sz = ch[]->sz + ch[]->sz + ;
} int cmp(int k) const {
int s = ch[]->sz + ;
if(k == s) return -;
return k < s ? : ;
}
}pool[N], *pis = pool, *root; void init() {
null = new(pis++) Node();
null->sz = ;
null->ch[] = null->ch[] = null;
root = new(pis++) Node(-);
root->ch[] = new(pis++) Node(-);
} void rotate(Node*& o, int d) {
Node* t = o->ch[d];
o->ch[d] = t->ch[d^];
t->ch[d^] = o;
o->maintain();
(o = t)->maintain();
} void splay(Node*& o, int k) {
int d = o->cmp(k);
if(d == -) return;
if(d == ) k -= o->ch[]->sz + ;
Node*& c = o->ch[d];
int d2 = c->cmp(k);
if(d2 != -) {
if(d2 == ) k -= c->ch[]->sz + ;
splay(c->ch[d2], k);
if(d == d2) rotate(o, d);
else rotate(c, d2);
}
rotate(o, d);
} void split(Node*o, int k, Node*& l, Node*& r) {
splay(o, k);
l = o;
r = o->ch[];
o->ch[] = null;
o->maintain();
} Node* merge(Node* l, Node* r) {
splay(l, l->sz);
l->ch[] = r;
l->maintain();
return l;
} void print(Node* o) {
if(o == null) return;
print(o->ch[]);
if( < o->v) putchar(o->v);
print(o->ch[]);
} Node* newtree(const char s[], int l, int r) {
if(l > r) return null;
int mid = (l + r) >> ;
Node* o = new(pis++) Node();
o->ch[] = newtree(s, l, mid - );
o->v = s[mid];
o->ch[] = newtree(s, mid + , r);
o->maintain();
return o;
} char text[N]; void insert(int pos, Node* o) {
Node *lft, *rgt;
split(root, pos, lft, rgt);
root = merge(lft, merge(o, rgt));
} int main() {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif int m;
scanf("%d", &m);
init(); char opt[], c;
int pos = , n, sz = ;
Node *o, *lft, *rgt, *mid; while(m--) {
scanf("%s", opt);
if(strcmp(opt, "Move") == ) {
scanf("%d", &pos); ++pos;
}else if(strcmp(opt, "Insert") == ) {
int n;
scanf("%d", &n);
for(int i = ; i < n; i++) {
c = getchar();
while(c == '\n') c = getchar();
text[i] = c;
}
sz += n;
insert(pos, newtree(text, , n - ));
}else if(strcmp(opt, "Delete") == ) {
scanf("%d", &n);
n = min(sz - pos + , n);
split(root, pos, lft, o);
split(o, n, mid, rgt);
sz -= mid->sz;
root = merge(lft, rgt);
}else if(strcmp(opt, "Prev") == ) {if(pos > ) pos--;}
else if(strcmp(opt, "Next") == ) {if(pos <= sz) pos++;}
else {
scanf("%d", &n);
split(root, pos, lft, o);
n = min(sz - pos + , n);
split(o, n, mid, rgt);
print(mid); puts("");
root = merge(merge(lft, mid), rgt);
}
} return ;
}

有空了去写块链?

NOI2003 文本编辑器的更多相关文章

  1. [NOI2003] 文本编辑器 (splay)

    复制炸格式了,就不贴题面了 [NOI2003] 文本编辑器 Solution 对于光标的移动,我们只要记录一下现在在哪里就可以了 Insert操作:手动维护中序遍历结果,即每次取中点像线段树一样一样递 ...

  2. 洛谷 P4008 [NOI2003]文本编辑器 解题报告

    P4008 [NOI2003]文本编辑器 题目描述 很久很久以前,\(DOS3.x\)的程序员们开始对 \(EDLIN\) 感到厌倦.于是,人们开始纷纷改用自己写的文本编辑器⋯⋯ 多年之后,出于偶然的 ...

  3. [NOI2003]文本编辑器 [Fhq Treap]

    [NOI2003]文本编辑器 没啥好说的 就是个板子 #include <bits/stdc++.h> // #define int long long #define rep(a , b ...

  4. cogs 330. [NOI2003] 文本编辑器

    ★★★   输入文件:editor2003.in   输出文件:editor2003.out   简单对比 时间限制:2 s   内存限制:128 MB [问题描述] 很久很久以前,DOS3.x的程序 ...

  5. luogu P4008 [NOI2003]文本编辑器 splay 块状链表

    LINK:文本编辑器 这个东西感觉块状链表写细节挺多 (块状链表本来就难写 解释一下块状链表的做法:其实是一个个数组块 然后利用链表给链接起来 每个块的大小为sqrt(n). 这样插入删除的时候直接暴 ...

  6. NOI2003 文本编辑器editor

    1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1908  Solved: 738[Submit][Statu ...

  7. 题解 P4008 【[NOI2003]文本编辑器】

    块状链表及其应用 思路楼上已经说的很清楚了 看代码注释 代码很丑 #include<cstdio> #include<cctype> #include<cstring&g ...

  8. P4008 [NOI2003]文本编辑器

    思路 FHQ Treap的板子 用FHQ Treap维护中序遍历序列即可 然后数组开够! 代码 #include <cstdio> #include <cstring> #in ...

  9. 【洛谷 P4008】 [NOI2003]文本编辑器 (Splay)

    题目链接 \(Splay\)先练到这吧(好像还有道毒瘤的维护数列诶,算了吧) 记录下光标的编号,维护就是\(Splay\)基操了. 另外数据有坑,数据是\(Windows\)下生成了,回车是'\n\r ...

随机推荐

  1. java_设计模式_策略模式_Strategy pattern(2016-07-15)

    感受:将算法从方法级别,提升到类级别.之后利用java多态,来切换不同的算法实现不同的功能. 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属 ...

  2. POJ 3468.A Simple Problem with Integers 解题报告

    用树状数组和线段树会比较简单,这里用这道题来学习Splay. 第一次写,代码比较丑 /* 初始化添加一个key值足够大的结点 保证每个需要的结点都有后继 */ #include <iostrea ...

  3. PHP替换中文字符

    mb_regex_encoding('utf-8');$htmlNavSubmenu2 = str_replace('<li id="w-menu-food-334"> ...

  4. git config找到下载的路径URL

      有时想在别的机器上下载自己的上传的源代码,发现git不像svn那么方便一眼就能看到下载地址,这两天在网上查了一下,终于找到方法了. 一般本地的github目录下总会有一个.git目录,点击进入,可 ...

  5. chdir 改变当前目录为起始目录

    <?php chdir(dirname(__FILE__));//把当前目录设置为当前目录?> 将 PHP 的当前目录改为 directory. 参数 directory 新的当前目录 返 ...

  6. aix7安装was7、打补丁、更改访问端口、手动启动was、配置was7、部署项目

    1:准备工作  首先了解下我们下面即将用到的aix命令,以及安装包.补丁安装工具.补丁 was7的安装包以及补丁工具都是压缩包形式并且以.tar.gz结尾的 安装包在800MB左右,通常为****_w ...

  7. 在2015中使用V12版本的ReportView控件,会导致winform窗体不能正常打开

    在2015中使用V12版本的ReportView控件,会导致winform窗体不能正常打开,使用V10版本没问题,但2015中默认使用的就是V12版本,所以需要避免使用V12版本

  8. JavaScript中document.cookie

    “某些 Web 站点在您的硬盘上用很小的文本文件存储了一些信息,这些文件就称为 Cookie.”—— MSIE 帮助.一般来说,Cookies 是 CGI 或类似,比 HTML 高级的文件.程序等创建 ...

  9. jsp注释方式

    1,HTML的注释方法 <!--...add your comments here...--> 说明:使用该注释方法,其中的注释内容在客户端浏览中是看不见的.但是查看源代码时,客户是可以看 ...

  10. codevs 1078 最小生成树

    题目描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这 ...