NOI2003 文本编辑器 块状链表
来源:互联网 发布:营销网络优势 编辑:程序博客网 时间:2024/04/27 08:52
刚看到这道题时还啥也不懂,后来被安利了块状链表,于是搞了好久,现在发现Splay也可以搞….
下面是块状链表搞法….
#include<cstring>#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>using namespace std;const int maxtot=2*1024*1024+100;const int maxsize=5500;const int maxnum=maxtot/maxsize*2+100;int pool[maxnum],next[maxnum],size[maxnum];char data[maxnum][maxsize];char ming[50],biao[maxtot];int n,pos,surenum;void find(int &p,int &b){ for(b=0;b!=-1&&p>size[b];b=next[b])p-=size[b];}int newnode(){ return pool[surenum++];}void del(int x){ pool[--surenum]=x;}void fillbank(int b,int ma,char chr[],int nex){ size[b]=ma;next[b]=nex; memcpy(data[b],chr,ma);}void split(int p,int b){ if(p==size[b]||b==-1)return; int t=newnode(); fillbank(t,size[b]-p,data[b]+p,next[b]); size[b]=p;next[b]=t;}void init(){ for(int i=1;i<maxnum;++i) pool[i]=i; surenum=1; next[0]=-1;size[0]=0;}void maintain(int b){ for(;b!=-1;b=next[b]) for(int t=next[b];t!=-1&&size[b]+size[t]<=maxsize;t=next[b]) { memcpy(data[b]+size[b],data[t],size[t]); size[b]+=size[t];next[b]=next[t];del(t); }}void insert(int no,int len,char biao[]){ int b,i,t; find(no,b); split(no,b); for(i=0;i+maxsize<=len;i+=maxsize) { t=newnode(); fillbank(t,maxsize,biao+i,next[b]); next[b]=t;b=t; } if(len-i) { t=newnode(); fillbank(t,len-i,biao+i,next[b]); next[b]=t; } maintain(b);}void DELETE(int p,int len){ int b,e; find(p,b); split(p,b); for(e=next[b];e!=-1&&len>size[e];e=next[e])len-=size[e]; split(len,e);e=next[e]; for(int i=next[b];i!=e;i=next[i]) { next[b]=next[i];del(i); } maintain(b);}void get(int p,int len){ int b,i,t; find(p,b);i=min(len,size[b]-p); memcpy(biao,data[b]+p,i); for(t=next[b];t!=-1&&i+size[t]<=len;i+=size[t],t=next[t]) memcpy(biao+i,data[t],size[t]); if(len-i&&t!=-1) memcpy(biao+i,data[t],len-i); biao[len]='\0'; printf("%s\n",biao);}int main(){ freopen("editor2003.in","r",stdin); freopen("editor2003.out","w",stdout); scanf("%d",&n); init(); for(int i=1;i<=n;++i) { scanf("%s",ming);int x;char c; if(ming[0]=='M') { scanf("%d",&pos);continue; } if(ming[0]=='I') { scanf("%d",&x); for(int i=0;i<x;++i) { scanf("%c",&c); while(c<32||c>126)scanf("%c",&c); biao[i]=c; } insert(pos,x,biao);continue; } if(ming[0]=='D') { scanf("%d",&x);DELETE(pos,x);continue; } if(ming[0]=='G') { scanf("%d",&x);get(pos,x);continue; } if(ming[0]=='P'){pos--;continue;} if(ming[0]=='N'){pos++;continue;} } return 0;}
HelenKeller 2016.7.4
0 0
- NOI2003 文本编辑器 块状链表
- BZOJ 1507([NOI2003]Editor-块状链表)
- BZOJ_P1507[NOI2003]Editor(块状链表)
- [BZOJ1507][NOI2003]Editor(块状链表)
- NOI2003文本编辑器
- bzoj 1507: [NOI2003]Editor (块状链表)
- bzoj 1269 [AHOI2006]文本编辑器editor 块状链表
- 块状链表
- 块状链表 poj2887
- 块状链表
- 数据结构:块状链表
- 数据结构:块状链表
- java 块状链表
- 块状链表
- 块状链表
- 块状链表
- *块状链表
- POJ2887【块状链表】
- 3.4 单片机中三极管的应用
- 深度学习与自然语言处理(6)_斯坦福cs224d 一起来学Tensorflow part1
- GridControl Group Summary Custom
- label
- mysql 设置字段为null
- NOI2003 文本编辑器 块状链表
- HTML5+规范:XMLHttpRequest(管理网络请求)
- 3.5 74HC138三八译码器的应用
- 基数排序
- BZOJ 1006 [HNOI2008]神奇的国度==最大势算法
- 【leetcode】19. Remove Nth Node From End of List
- 3.6 LED灯闪烁程序
- 机器人走方格(DP/递归)
- Hibernate学习(一)--Hello Hibernate