萌新刚学 OI,求助入门题 qwq

P4008 [NOI2003] 文本编辑器

真就是入门题啊
by lhs_chris @ 2023-11-01 20:55:11


更新了,现在 70 分,WA on #1,7,8 ```cpp /* Input: 8 Move 0 Insert 12 -1938rhefids Insert 13 1145141919810 Move 7 Get 10 Insert 4 asf1 Move 0 Get 15 Output: 919810-193 1145141asf19198 */ #include<iostream> #include<cstdio> using namespace std; /*==================================================================*/ const int standard=900; struct Node{ char c; int bid,prev,next; }a[4100010]; struct Block{ int sz,beg,prev,next; }b[20010]; int curpos,begb,enda,endb; void Split(int bid) { int k=b[bid].sz,now=b[bid].beg; b[bid].sz/=2,endb++; for(int i=1;i<=k;i++) { if(i>k/2) { if(i==k/2+1) { b[endb].sz=k-k/2,b[endb].beg=now; b[endb].prev=bid,b[endb].next=b[bid].next; b[b[bid].next].prev=endb,b[bid].next=endb; } a[now].bid=endb; } now=a[now].next; } } void Merge(int bid) { int bid2=b[bid].next,now=b[bid2].beg; for(int i=1;i<=b[bid2].sz;i++) a[now].bid=bid,now=a[now].next; b[bid].sz+=b[bid2].sz; b[bid].next=b[bid2].next,b[b[bid2].next].prev=bid; b[bid2].prev=b[bid2].next=0; } int Find(int x) { int bid=begb; while(x>=b[bid].sz&&b[bid].sz)x-=b[bid].sz,bid=b[bid].next; int now=a[b[bid].beg].prev; while(x--) { if(now)now=a[now].next; else now=b[begb].beg; } return now; } void Insert(int x,char c) { enda++; a[enda].c=c; if(x)a[enda].bid=a[x].bid; else if(a[x].next)a[enda].bid=a[a[x].next].bid,b[a[enda].bid].beg=enda; else a[enda].bid=++endb,b[endb].sz=1,b[endb].beg=enda,begb=endb; a[enda].prev=x,a[enda].next=a[x].next; a[a[x].next].prev=enda,a[x].next=enda; if(++b[a[x].bid].sz>=2*standard)Split(a[x].bid); } void Delete(int x) { int bid=a[x].bid; a[a[x].prev].next=a[x].next,a[a[x].next].prev=a[x].prev; a[x].prev=a[x].next=0; if(--b[bid].sz<standard) { if(b[bid].prev&&b[b[bid].prev].sz+b[bid].sz<2*standard) Merge(b[bid].prev); else if(b[bid].next&&b[b[bid].next].sz+b[bid].sz<2*standard) Merge(bid); } } /*==================================================================*/ char read() { char c=getchar(); while(c<32||c>126)c=getchar(); return c; } int main() { int t; scanf("%d",&t); while(t--) { string op; cin>>op; if(op=="Move") { int x; scanf("%d",&x); curpos=Find(x); } if(op=="Insert") { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { char c=read(); Insert(curpos,c); curpos=a[curpos].next; } while(n--)curpos=a[curpos].prev; } if(op=="Delete") { int n; scanf("%d",&n); while(n--) Delete(a[curpos].next); } if(op=="Get") { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { curpos=a[curpos].next; printf("%c",a[curpos].c); } printf("\n"); while(n--)curpos=a[curpos].prev; } if(op=="Prev")curpos=a[curpos].prev; if(op=="Next")curpos=a[curpos].next; } return 0; } ```
by Night_sea_64 @ 2023-11-01 21:55:00


已调对,此帖结
by Night_sea_64 @ 2023-11-02 11:40:59


|