|
8#
楼主 |
发表于 2020-4-29 11:48:40
|
只看该作者
下面的删除和删除就很简单,只是int R=Getkth(root,curpos+2)这里在加上一个偏移k就是了。只要保证前面的curpos和k的分析没有问题就行了
MOVE、PREV、NEXT就直接curpos=k;--curpos,++curpos算了。
整理了一个完整程序,
- #include <bits/stdc++.h>
- using namespace std;
- const int mm=2100000;
- struct Node {
- char val;
- int fa,s[2],sz;
- } a[mm];
- int root,tot,curpos,offset;
- void ArrayPr() { /// 调试监视使用
- cout<<endl<<" i ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<i;
- cout<<endl<<"val ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].val;
- cout<<endl<<" s0 ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].s[0];
- cout<<endl<<" s1 ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].s[1];
- cout<<endl<<" fa ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].fa;
- cout<<endl<<" sz ";
- for (int i=1; i<=tot; i++) cout<<setw(3)<<a[i].sz;
- cout<<endl;
- }
- void pushup(int x) {
- int l=a[x].s[0],r=a[x].s[1];
- a[x].sz=a[l].sz+a[r].sz+1;
- }
- int son(int x) {
- int y=a[x].fa;
- return a[y].s[1]==x;
- }
- void R(int x) {
- int y=a[x].fa;
- int z=a[y].fa;
- int k=son(x);
- int v=a[x].s[k^1];
- a[y].s[k]=v,a[v].fa=y;
- a[z].s[son(y)]=x,a[x].fa=z;
- a[x].s[k^1]=y,a[y].fa=x;
- pushup(y),pushup(x);
- }
- void Splay(int x,int rt=root) { ///把x旋到rt的位置 默认rt是根
- rt=a[rt].fa;
- int y,z;
- while(a[x].fa!=rt) {
- y=a[x].fa,z=a[y].fa;;
- if(z!=rt)
- if(son(x)==son(y))R(y);
- else R(x);
- R(x);
- }
- if(rt==0)root=x;
- }
- int Build(string s,int l,int r) { ///把s串L-R之间的建树
- if (l>r)return -1;
- if (l==r) {
- a[offset+l].val=s[l],a[offset+l].sz=1;
- return l;
- }
- if (l<r) {
- int m=(l+r)/2;
- a[offset+m].val=s[m];
- int tl=0,tr=0;
- if (m-1>=l) {
- tl=Build(s,l,m-1),a[offset+tl].fa=offset+m,a[offset+m].s[0]=offset+tl;
- }
- if (m+1<=r) {
- tr=Build(s,m+1,r),a[offset+tr].fa=offset+m,a[offset+m].s[1]=offset+tr;
- }
- a[offset+m].sz=r-l+1;
- return m;
- }
- }
- int Getkth(int rt, int x) { ///在RT子树中找第k小
- int l=a[a[rt].s[0]].sz; /// RT的左儿子下的个数
- if(l+1==x) return rt;
- if(l+1>x) return Getkth(a[rt].s[0], x); ///左儿子里去找
- if(l+1<x) return Getkth(a[rt].s[1], x-(l+1));
- }
- void NewEmpty() { /// 建新的假树
- a[1].val=a[2].val='@';
- a[1].s[0]=a[2].s[0]=a[2].s[1]=0,a[1].s[1]=2;
- a[1].fa=0,a[2].fa=1;
- a[1].sz=2,a[2].sz=1;
- root=1,tot=2,curpos=0;
- }
- void BSTPr(int x) {
- int l=a[x].s[0],r=a[x].s[1];
- if (l>0) BSTPr(l);
- cout<<a[x].val;
- if (r>0) BSTPr(r);
- }
- void get(int n) {
- int t=a[root].s[1];
- Splay(curpos,root),Splay(curpos+n+1,t);
- BSTPr(t);
- }
- int main() {
- int n;
- cin>>n;
- NewEmpty();
- while (n--) {
- char opt[10];
- scanf("%s", opt);
- if (opt[0]=='M') {
- int k;
- scanf("%d",&k);
- curpos=k;
- ///Getkth(root,k+1);
- ///cout<<"curpos="<<curpos<<endl;
- }
- if (opt[0]=='I') {
- int l,i=1;
- scanf("%d",&l);
- char ch;
- string s="#";
- while (i<=l) {
- ch=getchar();
- while(ch<32||ch>126) ch=getchar();
- i++;
- s=s+ch;
- }
- offset=tot;
- tot+=l;
- int tm=offset+Build(s,1,l);
- Splay(L,root),Splay(R,a[root].s[1]);
- a[R].s[0]=tm,a[tm].fa=R;
- pushup(R),pushup(L);
- }
- if (opt[0]=='G') {
- int k;
- scanf("%d",&k);
- int L=Getkth(root,curpos+1);
- int R=Getkth(root,curpos+k+2);
- Splay(L,root),Splay(R,a[root].s[1]);
- BSTPr(a[R].s[0]);
- printf("\n");
- }
- if (opt[0]=='D') {
- int k;
- scanf("%d",&k);
- int L=Getkth(root,curpos+1);
- int R=Getkth(root,curpos+k+2);
- Splay(L,root),Splay(R,a[root].s[1]);
- a[R].s[0]=0;
- pushup(R),pushup(L);
- }
- if (opt[0]=='P') curpos--;
- if (opt[0]=='N') curpos++;
- }
- return 0;
- }
- /*
- 10
- Insert 10
- abcdefghij
- Move 5
- Insert 10
- 0123456789
- Move 3
- Ins 2
- **
- Move 10
- In 3
- %%%
- Del 3
- */
复制代码 |
|