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

来源:互联网 发布:淘宝销量怎么查看 编辑:程序博客网 时间:2024/06/05 08:23

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--;    }}
阅读全文
1 0