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

Description

这里写图片描述

Data Constraint

这里写图片描述

Solution

我们考虑用双向链表维护这个序列。但问题是怎样处理序列翻转的问题。我们考虑维护多一个反向序列,所有操作同时在两个序列上进行,只是将方向反转。当遇到一个翻转操作时我们就交换两个序列。时间复杂度O(N)。

Code

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1.1e7+5;
int l[maxn],r[maxn];
int n,m,i,t,j,k,ll,x,y,z,len,rr,tot,num,l2,r2,tot1;
char bz,ch,s[maxn];
void insert(int &x){
    if (x==tot) tot=len;
    l[len]=l[x];r[l[x]]=len;l[x]=len;r[len]=x;
    l[0]=r[0]=0;
}
void insert1(int &x){
    r[len]=r[x];l[r[x]]=len;r[x]=len;l[len]=x;
    l[0]=r[0]=0;
}
void dele(int x,int y){
    if (!s[x]){
        putchar('F');return;
    }num+=y;
    putchar('T');
    r[l[x]]=r[x];l[r[x]]=l[x];
    l[0]=r[0]=0;
    if (x==tot) tot=r[x];
    if (ll==x) ll=r[x];
    if (rr==x) rr=r[x];
}
void dele1(int x){
    if (!s[x])return;
    l[r[x]]=l[x];r[l[x]]=r[x];
    l[0]=r[0]=0;
    if (l2==x) l2=l[x];
    if (r2==x) r2=l[x];
}
int main(){
//  freopen("data.in","r",stdin);freopen("data.out","w",stdout);
    scanf("%s\n",s+1);len=strlen(s+1);
    for (i=1;i<=len;i++)l[i]=i-1,r[i]=i+1;
    num=len;ll=1;rr=len+1;tot=1;l[rr]=len;r[len]=rr;
    for (i=len+2;i<=2*len+1;i++)s[i]=s[i-len-1],l[i]=i+1,r[i]=i-1;
    r[len+2]=0;
    l2=len+2;r2=2*len+2;r[2*len+2]=2*len+1;l[2*len+1]=2*len+2;
    len=len*2+2;
    scanf("%d\n",&n);
    while(n){
        scanf("%c",&bz);
        if (bz=='<'){
            scanf("%c",&bz);scanf("%c",&ch);
            if (ch=='L'){
                if(ll!=tot) ll=l[ll],putchar('T'),num++,l2=r[l2];
                else putchar('F');
            }else{
                if(rr!=tot) rr=l[rr],putchar('T'),num--,r2=r[r2];
                else putchar('F');
            }
        }else if (bz=='>'){
            scanf("%c",&bz);scanf("%c",&ch);
            if (ch=='L'){
                if(r[ll]) ll=r[ll],putchar('T'),num--,l2=l[l2];
                else putchar('F');
            }else{
                if(r[rr]) rr=r[rr],putchar('T'),num++,r2=l[r2];
                else putchar('F');
            }
        }else if (bz=='I'){
            scanf("%c",&bz);scanf("%c",&bz);scanf("%c",&ch);scanf("%c",&ch);
            s[++len]=ch;
            if (bz=='L'){
                insert(ll),num-=(num<0);
                s[++len]=ch;
                insert1(l2);
            }else{
                insert(rr),num+=(num>0);
                s[++len]=ch;
                insert1(r2);
            }
            putchar('T');
        }else if (bz=='D'){
            scanf("%c",&bz);scanf("%c",&bz);
            if (bz=='L') dele(ll,-(num>0)),dele1(l2);
            else dele(rr,(num<0)),dele1(r2);
        }else if (bz=='R'){
            if (num<=0) putchar('F');
            else{
                t=l[ll];k=l[rr];
                x=r[l2];y=r[r2];
                r[t]=y;l[y]=t;
                r[l2]=rr;l[rr]=l2;
                r[r2]=ll;l[ll]=r2;
                r[k]=x;l[x]=k;  
                if (ll==tot) tot=y;
                ll=y;l2=k;l[0]=r[0]=0;
                putchar('T');
            }
        }else{
            t=tot;
            while (s[t]) 
                putchar(s[t]),t=r[t];   
        }
        putchar('\n');
        scanf("\n");n--;
    }
}
发布了257 篇原创文章 · 获赞 451 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/crybymyself/article/details/77434889