【JZOJ5249】【NOIP2017提高A组模拟8.10】文本编辑器
2017-08-20 21:52
477 查看
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--; } }
相关文章推荐
- JZOJ5249. 【NOIP2017提高A组模拟8.10】文本编辑器
- 【JZOJ 5249】【NOIP2017提高A组模拟8.10】文本编辑器
- jzoj5249 【NOIP2017提高A组模拟8.10】文本编辑器 (序列修改类问题,数据结构)
- 【JZOJ 5248】【NOIP2017提高A组模拟8.10】花花的聚会
- 【jzoj5247】【NOIP2017提高A组模拟8.10】【计算几何】【二分答案】
- 【jzoj5248】【NOIP2017提高A组模拟8.10】【花花的聚会】【动态规划】【可持久化线段树】
- JZOJ5248. 【NOIP2017提高A组模拟8.10】花花的聚会
- 【JZOJ 4924】 【NOIP2017提高组模拟12.17】向再见说再见
- 【JZOJ4930】【NOIP2017提高组模拟12.18】C
- JZOJ 5354. 【NOIP2017提高A组模拟9.9】导弹拦截
- 【JZOJ 4932】【NOIP2017提高组模拟12.24】B
- 【jzoj5359】【NOIP2017提高A组模拟9.12】【Arrays and Palindrome】
- JZOJ5372. 【NOIP2017提高A组模拟9.17】猫 链表+贪心+堆优化
- JZOJ5379. 【NOIP2017提高A组模拟9.21】Victor爱数字
- 【jzoj5288】【NOIP2017提高组A组模拟8.17】【球场大佬】
- JZOJ 5379. 【NOIP2017提高A组模拟9.21】Victor爱数字
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 4000 (Standard IO)
- jzoj5330 【NOIP2017提高A组模拟8.22】密码
- 【JZOJ5287】【NOIP2017提高A组模拟8.16】最短路
- JZOJ 5393. 【NOIP2017提高A组模拟10.5】Snake vs Block