您的位置:首页 > 其它

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

2017-08-20 21:52 441 查看

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--;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: