BZOJ 1507 Editor
Description

Input
Output
Sample Input
Insert 26
abcdefghijklmnop
qrstuv wxy
Move 16
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
HINT
splay区间操作的裸题,就当是练习模板吧!
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
int t,a,p = ;
char cmd[],s[*+];
class Splay
{
private:
struct Node
{
char ch;int size,cnt;Node *c[],*fa;
Node (char _ch,Node *_fa)
{
ch = _ch; fa = _fa;
cnt = ; c[] = c[] = NULL;
}
int lsz(){return c[]?c[]->size:;}
int rsz(){return c[]?c[]->size:;}
};
Node *root;
inline void upd(Node *tag)
{
if (!tag) return;
tag->size = tag->cnt+tag->lsz()+tag->rsz();
}
inline void zig(Node *tag,int d)
{
Node *f = tag -> fa;
int anti = d^;
f -> c[d] = tag->c[anti];
if (f->c[d])
f -> c[d] -> fa = f;
tag -> fa = f -> fa;
if (tag -> fa -> c[] == f)
tag -> fa -> c[] = tag;
else tag -> fa -> c[] = tag;
f -> fa = tag;
tag -> c[anti] = f;
upd(f);
}
inline bool f(Node *tag){return tag->fa->c[] == tag;}
inline void splay(Node *tag,Node *goal)
{
while(tag->fa != goal){
if(tag->fa->fa == goal)
zig(tag,f(tag));
else{
if(f(tag) == f(tag->fa))
zig(tag->fa,f(tag->fa)),zig(tag,f(tag));
else
zig(tag,f(tag)),zig(tag,f(tag));
}
}
upd(tag);
}
inline Node *search(int key)
{
Node *tag = root->c[];
while (tag && (key <= tag->lsz()||key > tag -> lsz() + tag -> cnt))
{
if (key > tag ->lsz()+tag->cnt)
{
key -= tag->lsz()+tag->cnt; tag = tag->c[];
}
else tag = tag -> c[];
}
return tag;
}
public:
Splay()
{
root = new Node('#',NULL); Node *tmp = new Node('^',root); root ->c[] = tmp; upd(tmp);
}
void insert(char *s)
{
Node *chr = new Node(s[],NULL),*tmp,*now,*tag = root->c[];
tmp = now = chr; chr -> size = a;
for (int i = ;i < a;++i)
{
now = new Node(s[i],tmp);
tmp -> c[] = now; now -> size = a-i;
tmp = now;
}
Node *z = tag -> c[];
while (z && z->c[]) z = z->c[];
if (z)
{
splay(z,tag);
z -> c[] = chr; chr -> fa = z;
upd(z);
}
else
{
tag -> c[] = chr; chr -> fa = tag;
upd(tag);
}
}
void trans(int x) {Node *tag = search(x); splay(tag,root);}
void erase(int l)
{
Node *tag = root->c[]; if (!tag) return;
Node *end = search(tag->lsz()+tag->cnt+l+);
if (end){splay(end,tag); end -> c[] = NULL; upd(end);}
else tag -> c[] = NULL;
upd(tag);
}
void print(int l)
{
Node *tag = root->c[];
for (int i = ;i <= l;++i)
{
Node *tmp = search(p+i);
splay(tmp,tag);
putchar(tmp -> ch);
}
putchar('\n');
}
}tree;
int main()
{
freopen("1507.in","r",stdin);
freopen("1507.out","w",stdout);
scanf("%d",&t);
while (t--)
{
scanf("%s %d",cmd,&a);
if (cmd[] == 'I')
{
char c;
for (int i = ;i<a;)
{
while ((c = getchar())==||c == );
s[i++] = c;
}
tree.insert(s); continue;
}
if (cmd[] == 'M')
{
tree.trans(a+); p = a + ; continue;
}
if (cmd[] == 'D')
{
tree.erase(a); continue;
}
if (cmd[] == 'G')
{
tree.print(a); continue;
}
if (cmd[] == 'P')
{
tree.trans(--p); continue;
}
if(cmd[] == 'N')
{
tree.trans(++ p); continue;
}
}
fclose(stdin); fclose(stdout);
return ;
}
BZOJ 1507 Editor的更多相关文章
- BZOJ 1507 Editor(块状链表)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1507 题意:一个文本编辑器,模拟以下操作: 思路:块状链表的主要操作: (1)find( ...
- 【BZOJ 1507】【NOI 2003】&【Tyvj P2388】Editor 块状链表模板题
2016-06-18 当时关于块状链表的想法是错误的,之前维护的是一个动态的$\sqrt{n}$,所以常数巨大,今天才知道原因TwT,请不要参照这个程序为模板!!! 模板题水啊水~~~ 第一次写块状链 ...
- bzoj 1269 bzoj 1507 Splay处理文本信息
bzoj 1269 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1269 大致思路: 用splay维护整个文本信息,splay树的中序遍历即为 ...
- BZOJ 1507 [NOI2003]Editor
Description Input 输 入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉 ...
- BZOJ 1507 NOI2003 Editor Splay
题目大意: 1.将光标移动到某一位置 2.在光标后插入一段字符串 3.删除光标后的一段字符 4.输出光标后的一段字符 5.光标-- 6.光标++ 和1269非常像的一道题,只是弱多了 几个问题须要注意 ...
- BZOJ 1507 splay
写完维修数列 这不是水题嘛233333 //By SiriusRen #include <cstdio> #include <cstring> #include <alg ...
- BZOJ 1269: [AHOI2006]文本编辑器editor( splay )
splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...
- 平衡树之伸展树(Splay Tree)题目整理
目录 前言 练习1 BZOJ 3224 普通平衡树 练习2 BZOJ 3223 文艺平衡树 练习3 BZOJ 1588 [HNOI2002]营业额统计 练习4 BZOJ 1208 [HNOI2004] ...
- 【BZOJ】1507: [NOI2003]Editor(Splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=1507 当练splay模板了,发现wjmzbmr的splay写得异常简介,学习了.orzzzzzzzz ...
随机推荐
- Qt 学习之路 :Repeater
前面的章节我们介绍过模型视图.这是一种数据和显示相分离的技术,在 Qt 中有着非常重要的地位.在 QtQuick 中,数据和显示的分离同样也是利用这种“模型-视图”技术实现的.对于每一个视图,数据元素 ...
- linux下vi命令笔记
vim 编辑器 全屏编辑器 模式化编辑器 vi:Visual Interfacevim:VI iMproved vi增强版vi模式: 编辑模式(命令模式)(默认处于编辑模式) Ct ...
- noip 2003 传染病控制(历史遗留问题2333)
/*codevs 1091 搜索 几个月之前写的70分 今天又写了一遍 并且找到了错误 */ #include<cstdio> #include<vector> #define ...
- codevs1506传话(kosaraju算法)
- - - - - - - - 一个()打成[] 看了一晚上..... /* 求强连通分量 kosaraju算法 边表存图 正反构造两个图 跑两边 分别记下入栈顺序 和每个强连通分量的具体信息 */ ...
- Rouh set 入门知识3(上下近似集,正负域,边界域)
在RS中,引入两个概念:一个是下近似集,另一个是上近似集.下近似集是指当一个集合不能利用有效的等价关系被恰当的分类是时,则可通过另外的集合来达到这个集合的近似.形式上,设X⊆U是任一子集,R是U上的等 ...
- php验证是否为手机端还是PC
<?php $forasp = strtolower($_SERVER['HTTP_USER_AGENT']); if(strpos($forasp,'mobile')==true) { ech ...
- ios里面如何压缩图片
在iOS里面,压缩图片跟在其他环境里面差不多,都和累死, 就是对当前图片从新画图,制定一个尺寸的问题 UIImage* image = [UIImage imageNamed:@"cat.j ...
- 十六、C# 常用集合类及构建自定义集合(使用迭代器)
常用集合类及构建自定义集合 1.更多集合接口:IList<T>.IDictionary<TKey,TValue>.IComparable<T>.ICollectio ...
- Java hashCode 和 equals()
1 Object中定义的hashCode() public int hashCode() Returns a hash code value for the object. This method i ...
- undefined与null的区别(待修整)
没有实体的对象称为空对象.只用对象的引用,而不存在引用的实体对象 就叫做空对象 在常见的强类型语言中,通常有一个表示"空"的值,比如NULL.但是在Javascript中,空(或者 ...