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
原创粉丝点击