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. 视频转GIF+GIF录制

    GIF录制 Windows--oCam oCam使用非常简便,它还可以用来录音,录制视频,并且是单文件版,很小,使用也非常方便,如果用来录制GIF,大家导出录制的视频选择GIF格式就可以了: Wind ...

  2. 使用python脚本执行地理处理工具

    桌面ArcGIS包含800多种可在Python脚本中运行的地理处理工具. 通过Python脚本来运行地理处理工具,可以处理复杂的工作和执行批处理任务. 案例一:使用脚本执行地理处理工具(以裁剪为例) ...

  3. Theano 更多示例

    Logistic函数 logistic函数的图,其中x在x轴上,s(x)在y轴上. 如果你想对双精度矩阵上的每个元素计算这个函数,这表示你想将这个函数应用到矩阵的每个元素上. 嗯,你是这样做的: x= ...

  4. 使用最新AndroidStudio编写Android编程权威指南(第3版)中的代码会遇到的一些问题

    Android编程权威指南(第3版)这本书是基于Android7.0的,到如今已经过于古老,最新的Android版本已经到10,而这本书的第四版目前还没有正式发售,在最近阅读这本书时,我发现这本书的部 ...

  5. kube-apiserver 集群服务安装

    目录 创建 kube-apiserver 证书 生成证书和私钥 创建加密配置文件 创建审计策略文件 分发 kube-apiserver 二进制文件 创建后续访问 metrics-server 使用的证 ...

  6. 11-kubernetes RBAC 及授权

    目录 RBAC role 和 clusterrole rolebinding 和 clusterrolebinding 公共权限 clusterrole user 创建测试 创建role案例 创建 r ...

  7. python_排序

    快速排序 基本思想是:从一个数组中随机选出一个数N,通过一趟排序将数组分割成三个部分,1.小于N的区域 2.等于N的区域 3.大于N的区域,然后再按照此方法对小于区的和大于区分别递归进行,从而达到整个 ...

  8. ThinkPHP3.2.2实现持久登录(记住我)功能的方法

    实现持久登录,即用户在登录时,勾选了"记住我"之后,无论是否关闭浏览器,只要不退出登录,在指定的时间内始终保持登录状态(缺点是在另一台电脑上登录过后,之前那台电脑就不能继续保持登录 ...

  9. JS获得天数差异

    //获得天数差异 function datedifference(sDate1, sDate2) { //sDate1和sDate2是2006-12-18格式 var dateSpan, tempDa ...

  10. 设计模式GOF23(创建型模式)

    • 创建型模式:  单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式.   • 结构型模式: –适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.   • 行为型模式: 模 ...