bsoj5089 文本编辑器

/*
题意描述 九发明了一个完美的文本编辑器。这个编辑器拥有两个光标(cursor),所以九能够同时在两处地方插入和删除文本。这个编辑器除了正常的编辑功能以外,还有一些只有九才知道用处的功能,例如翻转两个光标之间的文本。某一天,九把自己的完美文本编辑器给弄丢了,但是她还有好多好多文本需要处理。于是她想请聪明又智慧的你帮她实现完美文本编辑器的一些功能。
功能列表如下: 功能名称 命令格式 说明
< (move left) < w w 为一个字符,“L”或“R”,表示左光标还是右光标(下同)。该命令将选定光标向左移动,如果已经是最左端则不移动。命令执行成功时输出“T”,若光标已经在最左端,则输出“F”。
> (move right) > w w 同上。与< 命令不同的是,该命令将光标向右移动。命令执行成功时输出“T”,若光标已经在最右端,则输出“F”。
I (insert) I w c w 同上。c 是一个可见字符(33≤ ascii 码 ≤ 126),代表在该光标左侧插入该字符。该命令始终输出“T”。
D (delete) D w w 同上。代表删除该光标右侧的一个字符。命令执行成功时输出“T”,若光标右侧没有字符输出“F”。
R (reverse) R 代表翻转左光标和右光标之间的字符。该命令只有左光标在右光标左侧时才能执行。(两光标重合时也不能执行)命令执行成功时输出“T”,否则输“F”。
S (show) S 代表显示当前处理的文本。该命令只输出文本,不输出“T”和“F”。
开始时文本编辑器中有一定内容,左光标在第一个字符左,右光标在最后一个字符右。 注意:在插入和删除操作中,没有被操作的光标与文本的相对左右位置保持不变。特别地,若两个光标重叠,操作后也仍然重叠。 输入格式 第一行是初始时文本编辑器内容。 第二行是一个正整数 N,N 表示操作次数。 接下来有 N 行,每行有一个命令,命令格式如上方表格。 输出格式 对于每个命令,按上方表格要求执行并输出。 样例输入 goodykc
11
I R u
I R l
> L
> L
> L
> L
R
D R
< R
D R
S 样例输出 T
T
T
T
T
T
T
F
T
T
goodluck 样例解释 [goodykc]
[goodykcu]
[goodykcul]
g[oodykcul]
go[odykcul]
goo[dykcul]
good[ykcul]
good[lucky]
good[lucky](光标右边没有字符,失败删除)
good[luck]y
good[luck]
goodluck 数据规模与约定 对于 40% 的数据:1 ≤ N , 初始文本长度 ≤ 100,数据不包含翻转(Reverse)操作;
另有 30% 的数据:1 ≤ N , 初始文本长度 ≤ 105,数据不包含翻转(Reverse)操作;
另有 20% 的数据:1 ≤ N , 初始文本长度 ≤ 105,数据包含翻转(Reverse)操作;
对于 100% 的数据:1 ≤ N , 初始文本长度 ≤ 4 × 106,输出文件大小 ≤ 20MB;
*/

没找到这道题的出处

我不知道为啥有人用splay还有什么双端队列做这道题

反正我考场一看这题就兴奋了

这不直接双向链表暴搞吗

Reverse就直接这样接一下就没了

不过这样将让双向链表无法判断左右方向,那就直接将双向链表变成无向的,指针记录真实的在左边的那个节点的编号,这样就像遍历树那样可以判方向了

考场3kb 70pt,考后+2kb 加上了rev操作

代码权当纪念,诸位看看笑笑就好

反正我是已经看不懂了:p

各种结构体引用三目运算符函数混乱毫无可读性的5kb代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
using namespace std;
const int INF=999999999; const int MXN=8E6+5; struct Node{
int v1,v2;
char c;
}nd[MXN];int pN;
struct Pter{
int id,pre;
/*void Debug(){
cout<<"Pter:"<<id<<"#"<<pre<<endl;
}*/
}p1,p2;
Pter Copy(Pter& A){
Pter B=(Pter){A.id,A.pre};
return B;
}
bool IsOK(Pter p){
if(p.id==0||(p.id==INF&&p.pre==INF)) return 0;
return 1;
} char str[MXN];int rpL,rpR;
void Build(){
int sLen=strlen(str);pN=sLen;
for(int i=1;i<sLen;i++) nd[i].v2=i+1;
for(int i=2;i<=sLen;i++) nd[i].v1=i-1;
nd[1].v1=0;nd[sLen].v2=INF;
for(int i=1;i<=sLen;i++) nd[i].c=str[i-1];
nd[0].v1=-INF,nd[0].v2=1;
p1.id=1;p1.pre=0;
p2.id=INF;p2.pre=sLen; rpL=1;rpR=strlen(str)+1;
}
Pter Left(Pter& nw){
int le=nw.pre;
if(le==0) return (Pter){0,0};
int lele=(nd[le].v1!=nw.id)?nd[le].v1:nd[le].v2;
Pter p=(Pter){le,lele};
return p;
}
Pter Right(Pter& nw){
int id=nw.id;if(id==INF) return (Pter){INF,INF};
int ri=(nd[id].v1==nw.pre)?nd[id].v2:nd[id].v1;
Pter p=(Pter){ri,id};
return p;
}
void Ins(Pter& nw,char c){
pN++;nd[pN].c=c;
int id=nw.id;
Pter le=Left(nw);
nd[pN].v1=le.id;nd[pN].v2=nw.id; int& leR=(nd[le.id].v1==id?nd[le.id].v1:nd[le.id].v2);
leR=pN; if(IsOK(Right(nw))){
int& nwL=(nd[id].v1==nw.pre?nd[id].v1:nd[id].v2);
nwL=pN;
}
nw.pre=pN;
}
bool Del(Pter& nw){
if(nw.id==INF){printf("F");return 0;}
Pter le=Left(nw);
Pter ri=Right(nw); int& leR=(nd[le.id].v1==nw.id?nd[le.id].v1:nd[le.id].v2);
leR=ri.id; if(IsOK(Right(ri))){
int& riL=(nd[ri.id].v1==nw.id?nd[ri.id].v1:nd[ri.id].v2);
riL=le.id;
}
nw.id=ri.id;
nw.pre=le.id;
printf("T");
return 1;
}
void Rev(){
Pter L=Copy(p1);
Pter LL=Left(L);
Pter RR=Copy(p2);
Pter R=Left(RR);
//cout<<L.id<<","<<LL.id<<"#"<<R.id<<","<<RR.id<<"###";
int& leleR=(nd[LL.id].v1==L.id?nd[LL.id].v1:nd[LL.id].v2);
leleR=R.id; int& leL =(nd[L.id].v1==LL.id?nd[L.id].v1:nd[L.id].v2);
leL=RR.id; if(IsOK(Right(RR))){
int& ririL=(nd[RR.id].v1==R.id?nd[RR.id].v1:nd[RR.id].v2);
ririL=L.id;
}
int& riR =(nd[R.id].v1==RR.id?nd[R.id].v1:nd[R.id].v2);
riR=LL.id; p1.id=R.id;
p2.pre=L.id;
}
void Print(){
Pter p=(Pter){nd[0].v2,0};
while(IsOK(Right(p))){//p.Debug();
printf("%c",nd[p.id].c);
p=Right(p); }
} int main(){
scanf("%s",str);
Build();
int qN;cin>>qN;
for(int i=1;i<=qN;i++){
char typ[2];scanf("%s",typ);
char wch[2],ccc[2];
switch(typ[0]){
case '<':{//cout<<"#";
scanf("%s",wch);Pter& p=(wch[0]=='L')?p1:p2;
Pter lp=Left(p);
if(!IsOK(lp)) printf("F");
else{
printf("T");
p=lp;
((wch[0]=='L')?rpL:rpR) --;
}
//p.Debug();
break;
}case '>':{//cout<<"V";
scanf("%s",wch);Pter& p=(wch[0]=='L')?p1:p2;
Pter rp=Right(p);
if(!IsOK(rp)) printf("F");
else{
printf("T");
p=rp;
((wch[0]=='L')?rpL:rpR) ++;
}
//p.Debug();
break;
}case 'I':{
scanf("%s",wch);Pter& p=(wch[0]=='L')?p1:p2;
Pter& otr=(wch[0]=='L')?p2:p1;
int& ooo=(wch[0]=='L')?rpL:rpR;
int& ppp=(wch[0]=='L')?rpR:rpL;
scanf("%s",ccc);char c=ccc[0];
int bomb=0;
if(p.id==otr.id&&p.pre==otr.pre) bomb=1;
Ins(p,c);
printf("T");
if(bomb==1) otr.id=p.id,otr.pre=p.pre;
if(ooo<=ppp) ppp++;
ooo++;
break;
}case 'D':{
scanf("%s",wch);Pter& p=(wch[0]=='L')?p1:p2;
Pter& otr=(wch[0]=='L')?p2:p1;
int& ooo=(wch[0]=='L')?rpL:rpR;
int& ppp=(wch[0]=='L')?rpR:rpL;
int bomb=0;
if(p.id==otr.id&&p.pre==otr.pre) bomb=1;
else if(otr.pre==p.id) bomb=2;
bool isSuc=Del(p);
if(bomb==1) otr.id=p.id,otr.pre=p.pre;
else if(bomb==2) otr.pre=p.pre;
//p.Debug();otr.Debug();
if(isSuc){
if(ooo<ppp) ppp--;
}
break;
}case 'R':{
//printf("F");
if(rpL<rpR){
Rev();
printf("T");
}else{
printf("F");
}
break;
}case 'S':{
Print();
break;
}
}
//cout<<p1.id<<','<<p1.pre<<"|"<<p2.id<<","<<p2.pre<<endl;
//cout<<"!"<<rpL<<','<<rpR;
printf("\n");
}
return 0;
}
/*
ab
111
R
S goodykc
11
I R u
I R l
> L
> L
> L
> L
R
D R
< R
D R
S
*/

[NOIP模拟]文本编辑器 题解的更多相关文章

  1. 一些noip模拟题一句话题解

    Problem A: 序列 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 12  Solved: 9[Submit][Status][Web Boar ...

  2. 【DP】【构造】NOIp模拟题 演讲 题解

        极其考思维的好题 题目背景 众所周知,$\mathrm{Zdrcl}$是一名天天$\mathrm{AK}$的高水平选手. 作为一民长者,为了向大家讲述自己$\mathrm{AK}$的经验,他决 ...

  3. [NOIP模拟测试38]题解

    来自达哥的问候…… A.金 显然本题的考察点在于高精而不是裴蜀定理 根据裴蜀定理易得答案为Yes当且仅当$gcd(n,m)=1$,那么考虑怎么在高精度下判互质. 如果$n,m$都能被2整除,那么显然不 ...

  4. NOIP模拟赛10 题解

    t3: 题意 给你一棵树,然后每次两种操作:1.给一个节点染色 : 2. 查询一个节点与任意已染色节点 lca 的权值的最大值 分析 考虑一个节点被染色后的影响:令它的所有祖先节点(包括自身)的所有除 ...

  5. [NOIP模拟33]反思+题解

    又考了一次降智题…… 拿到T1秒出正解(可能是因为我高考数学数列学的海星?),分解质因数以后用等比数列求和计算每个因子的贡献.但是当时太过兴奋把最后的$ans \times =$打成了$ans +=$ ...

  6. [NOIP模拟测试31]题解

    A.math 考场乱搞拿了95,2333. 考虑裴蜀定理:$ax+by=z$存在整数解,当且仅当$gcd(a,b)|z$. 那么如果某个数能够被拼出来,就必须满足所有$a_i$的$gcd$是它的因子. ...

  7. [NOIP模拟测试30]题解

    A.Return 出题人大概是怕自己的中文十级没人知道,所以写了这么一个***题面.可能又觉得这题太水怕全场A掉后自己面子过不去,于是又故意把输出格式说的含糊不清.(鬼知道"那么输出-1&q ...

  8. [NOIP模拟测试12]题解

    A. 找规律题.儿子的编号减去 小于它编号的最大的fibonacci数 即可得到它父亲的编号. 然后两个节点都暴力上跳就好了.预处理一下fibonacci数,每次二分查找即可. #include< ...

  9. [NOIP模拟测试11] 题解

    A.string 和河北的一道省选题很像.考场上写的暴力桶排,正解其实就是优化一下这个思路. 开线段树维护字符串中每个字母出现的次数.对于每条询问,区间查询.区间赋值维护即可. 另外,本题卡常严重,正 ...

随机推荐

  1. C语言之路

    C 简介 C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的.C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现. 在 1978 ...

  2. Head First设计模式——适配器和外观模式

    前言:为什么要一次讲解这两个模式,说点骚话:因为比较简单(*^_^*),其实是他们两个有相似和有时候我们容易搞混概念. 讲到这两个设计模式与另外一个“装饰者模式”也有相似,他们三个按照结构模式分类都属 ...

  3. 像黑客一样写博客–Pelican快速搭建静态博客

    "像黑客一样写博客",通过文本编辑器(Markdown编辑器)即可实现写博客,而且是静态的,很神奇吧,这里的方案是Pelican. 为啥叫 Pelican 这么奇怪的名字 &quo ...

  4. GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!

    大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻... 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚.当时一方面是因为菜,看着这种全是 ...

  5. 高德JS依赖分析工程及关键原理

    一.背景 高德 App 进行 Bundle 化后,由于业务的复杂性,Bundle 的数量非常多.而这带来了一个新的问题——Bundle 之间的依赖关系错综复杂,需要进行管控,使 Bundle 之间的依 ...

  6. day 17 re模块 正则表达式

    import re    引用re模块 查找 finall:匹配所有,每一项都是列表中的一个元素 search:只匹配从左到右的第一个,得到的不是直接的结果而是一个变量,通过group方法获取结果,没 ...

  7. Java并发编程:Callable、Future和FutureTask【转】

    原文链接:http://www.cnblogs.com/dolphin0520/p/3949310.html 创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这 ...

  8. Maven安装目录分析

    maven目录结构介绍 bin: 包含了mvn运行的脚本(既在cmd输入命令执行依赖,在命令行输入任何一条mvn命令时,实际上就是在调用这些脚本) boot: 该目录只包含一个文件,是一个类加载器,m ...

  9. js鼠标划过事件

    js鼠标划过事件一般有两对 onmouseover/onmouseout onmouseenter/onmouseleave 区别: 1.onmouseover/onmouseout 鼠标经过自身会触 ...

  10. 【SSL1455&1456】 电子老鼠闯迷宫 & 骑士游行

    考点概况: 广搜板子 题面: \[\Large\text{电子老鼠闯迷宫}\] \[Time~Limit:1000MS~~Memory~Limit:65536K\] Description 如下图12 ...