JZOJ5249. 【NOIP2017提高A组模拟8.10】文本编辑器

这里写图片描述
这里写图片描述

分析

我们发现,在这么多操作之中,R翻转是最难处理的。
那我们就先考虑如何将一个区间翻转。
splay?
这样可以拿到90分,如何拿到100分。
如何快速翻转一个区间,我们想到了双头队列,
对于翻转整个队列就是交换队头队尾。

我们将整个序列依次分为一个栈,左指针,一个双头队列,右指针,一个栈。
这样每一个操作就可以O(1)解决。

code

#include<cstdio>
#include<iostream>
#include<algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#define ll long long
#define N 4000003
#define db double
#define P putchar
#define G getchar
using namespace std;
int x,y,n,i,top1,top2;
int fx;
char z1[N*2],z2[N*2],s[N*2],ch,a,b,c,d;
int main()
{
    freopen("editor.in","r",stdin);
    freopen("editor.out","w",stdout);
    ch=G();
    x=2333;y=x-1;fx=1;
    while(ch<33 || ch>126)ch=G();
    while(33<=ch && ch<=126)s[++y]=ch,ch=G();
    scanf("%d",&n);
    while(n--)
    {
        ch=G();
        while(ch!='I' && ch!='<' && ch!='>' && ch!='D' && ch!='S' && ch!='R')
            ch=G();
        if(ch=='I')
        {
            a=G();
            while(a!='R' && a!='L')a=G();
            b=G();
            while(b<33 || b>126)b=G();
            P('T'),P('\n');
            if(a=='L')z1[++top1]=b;
                else y+=fx,s[y]=b;
        }

        if(ch=='<')
        {
            a=G();
            while(a!='R' && a!='L')a=G();
            if(a=='L')
            {
                if(top1)
                {
                    x-=fx;
                    s[x]=z1[top1--];
                    P('T');
                }else P('F');
            }
            else
            {
                z2[++top2]=s[y];
                y-=fx;
                P('T');
            }
            P('\n');
        }

        if(ch=='>')
        {
            a=G();
            while(a!='R' && a!='L')a=G();
            if(a=='L')
            {
                z1[++top1]=s[x];
                x+=fx;
                P('T');
            }
            else
            {
                if(top2)
                {
                    y+=fx;
                    s[y]=z2[top2--];
                    P('T');
                }else P('F');
            }
            P('\n');
        }

        if(ch=='D')
        {
            a=G();
            while(a!='R' && a!='L')a=G();
            if(a=='L')x+=fx,P('T');else
            {
                if(top2)top2--,P('T');else P('F');
            }
            P('\n');
        }

        if(ch=='R')
        {
            swap(x,y);
            fx=0-fx;
            P('T'),P('\n');
        }

        if(ch=='S')
        {
            for(int i=1;i<=top1;i++)
                P(z1[i]);

            for(int i=x;i!=y;i=i+fx)
                P(s[i]);
            P(s[y]);

            for(int i=top2;i;i--)
                P(z2[i]);

            P('\n');
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值