【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
- JZOJ5249. 【NOIP2017提高A组模拟8.10】文本编辑器
- 【JZOJ5249】【NOIP2017提高A组模拟8.10】文本编辑器
- jzoj5249 【NOIP2017提高A组模拟8.10】文本编辑器 (序列修改类问题,数据结构)
- 【JZOJ 5249】【NOIP2017提高A组模拟8.10】文本编辑器
- 【NOIP2017提高A组模拟8.10】文本编辑器
- 花花的聚会【NOIP2017提高A组模拟8.10】
- A【NOIP2017提高组模拟12.18】
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
- 【NOIP2017提高组模拟12.18】A
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
- 【NOIP2017提高A组模拟7.7】图
- 【NOIP2017提高A组模拟7.13】abcd
- 区间【NOIP2017提高A组模拟7.10】
- 【NOIP2017提高A组模拟8.22】密码
- 【NOIP2017提高A组模拟8.23】密码
- 【NOIP2017提高A组模拟8.24】早苗
- 【NOIP2017提高A组模拟8.24】提米树
- 空【NOIP2017提高A组模拟8.24】
- 【C#基础知识】——初识委托(delegate)
- 静态变量和成员变量的区别
- 【算法学习】求两数组求差数(Java,三重境界)
- IntelliJ IDEA+SpringBoot用JDBC做一个小型的javaWeb程序
- HashMap和Hashtable的区别
- 【JZOJ5249】【NOIP2017提高A组模拟8.10】文本编辑器
- 【MySQL】索引分析与优化
- MyCat:开源分布式数据库中间件之数据库分片和读写分离配置
- BZOJ[3211]花神游历各国 树状数组+并查集
- hdu 4612 Warm up
- 对Dubbo的一些理解
- Codeforces Round #428
- 剑指offer_二叉树---二叉搜索树的后序遍历
- 经典算法之汉诺塔求解问题