bzoj1507

来源:互联网 发布:手工西装淘宝 编辑:程序博客网 时间:2024/06/08 12:36

靠靠靠本来准备早餐写平衡树套线段树的。。。。

结果调块链直接就到这会了。。。

一会还是看充电器吧。。。

又是喜闻乐见的模版题目,苏煜的论文写得不错。。。

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#define MAX_block 2*1024*1024/4000+100#define BlockSize 20000using namespace std;char date[MAX_block][BlockSize];int list[MAX_block],pos;int next[MAX_block];int Count[MAX_block];int cur=0;char str[2*1024*1024+10];int new_node(){return list[pos++];}void del_node(int t){list[--pos]=t;}void init(){for(int i=1;i<MAX_block;i++)list[i]=i;pos=1;next[0]=-1;Count[0]=0;return ;}/*void find(int &p,int &b){for(b=0;b!=-1&&p>Count[b];b=next[b])p-=Count[b];}void fillnode(int b,int n,char str[],int e){if(b==-1)return;next[b]=e;Count[b]=n;memcpy(date[b],str,n);}*/void find(int &p,int &b){for(b=0; b!=-1 && p>Count[b]; b=next[b])p-=Count[b];}void fillnode(int b,int n,char str[],int e){if(b==-1)return;next[b]=e;Count[b]=n;memcpy(date[b], str, n);}void split(int b,int p){if(b==-1 || p==Count[b])return;int t=new_node();fillnode (t, Count[b]-p, date[b]+p, next[b]);next[b]=t;Count[b]=p;}/*void maintain(int x){//while(x!=-1)for(;x!=-1;x=next[x]){for(int t=next[x];t!=-1&&Count[x]+Count[t]<=BlockSize;t=next[x]){memcpy(date[x]+Count[x],date[t],Count[t]);Count[x]+=Count[t];next[x]=next[t];del_node(t);}//x=next[x];}}*/void maintain(int b){for(; b!=-1; b=next[b])for(int t=next[b]; t!=-1 && Count[b] + Count[t] <= BlockSize; t=next[b]){memcpy(date[b]+Count[b], date[t], Count[t]);Count[b]+=Count[t];next[b]=next[t];del_node(t);}}void split_fuck(int b,int p){if(b==-1||Count[b]==p)return;int t=new_node();fillnode(t,Count[b]-p,date[b]+p,next[b]);next[b]=t;Count[b]=p;}/*void erase(int x,int num){int b,e;find(x,b);split(b,x);for(e=next[b];e!=-1&&num>Count[e];e=next[e])num-=Count[e];split(e,num);e=next[e];for(int t=next[b];t!=e;t=next[b]){next[b]=next[t];del_node(t);}maintain(b);}*/void erase(int p,int n){int b,e;find(p,b);split(b,p);for(e=next[b]; e!=-1 && n>Count[e]; e=next[e])n-=Count[e];split (e,n);e=next[e];for(int t=next[b]; t!=e; t=next[b]){next[b]=next[t];del_node(t);}maintain(b);}/*void insert(int p,int n,char str[]){int b,t,i;printf("1\n");find(p,b);printf("2\n");split(b,p);printf("3\n");for(i=0;i+BlockSize<=n;i+=BlockSize){t=new_node();fillnode(t,BlockSize,str+i,next[b]);next[b]=t;b=t;}printf("4\n");if(n-i){t=new_node();fillnode(t,n-i,str+i,next[b]);next[b]=t;}printf("5\n");maintain(b);printf("6\n");}*/void insert(int p,int n,char str[]){int b,t,i;find(p,b);split(b,p);for(i=0; i+BlockSize <= n; i+=BlockSize){t=new_node();fillnode(t, BlockSize, str+i, next[b]);next[b]=t;b=t;}if(n-i){t=new_node();fillnode(t, n-i, str+i, next[b]);next[b]=t;}maintain(b);}/*void get(int p,int n,char str[]){int b,t,i;find(p,b);i=min(n,Count[b]-p);memcpy(str,date[b]+p,i);for(t=next[b];t!=-1&&i+Count[t]<=n;i+=Count[t],t=next[t])memcpy(str+i,date[t],Count[t]);if(n-i&&t!=-1)memcpy(str+i,date[t],n-i);str[n]='\0';}*/void get(int p,int n,char str[]){int b,t,i;find(p,b);i=min(n, Count[b]-p);memcpy(str, date[b]+p, i);for(t=next[b]; t!=-1 && i + Count[t] <= n; i+=Count[t],t=next[t])memcpy(str+i, date[t], Count[t]);if(n-i && t!=-1)memcpy(str+i, date[t], n-i);str[n]='\0';}void fuck_it(){int time;scanf("%d",&time);while(time--){char answer[1024*1024];char ch;int n;//printf("******************%d**********\n",cur);scanf("%s",answer);switch (answer[0]){case 'M': scanf("%d",&n); cur=n; break;case 'I':scanf("%d",&n);// printf("%d\n",n); /*for(int i=0;i<n;i++) { scanf("%c",&ch); if(ch>=32&&ch<=126) str[i]=ch; else i--; }*/ for(int i=0;i<n;i++) { scanf("%c",&ch); str[i]=ch; if(ch>126||ch<32) i--; }/* for(int i=0;i<n;i++) printf("%c %d\n",str[i],i); printf("\n");*/ //system("pause"); //printf("%d %d %s\n",cur,n,str); insert(cur,n,str);// printf("insert\n"); break;case 'D':scanf("%d",&n); erase(cur,n); //printf("delete\n"); break; case 'G':scanf("%d",&n); get(cur,n,str); printf("%s\n",str);// printf("get\n");break;case 'P':cur--; break;case 'N':cur++; break;}}}int main(){init();fuck_it();return 0;}

0 0
原创粉丝点击