• 数据结构:Rope-区间翻转


    BZOJ1269

    上一篇文章介绍了Rope的简单应用,这里多了一个操作,区间翻转

    同时维护一正一反两个rope……反转即交换两个子串

    下面给出代码:

     1 #include<cstdio>
     2 #include<ext/rope>
     3 using namespace std;
     4 using namespace __gnu_cxx;
     5 inline int read()
     6 {
     7     int x=0;char ch=getchar();
     8     while(ch>'9'||ch<'0') ch=getchar();
     9     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    10     return x;
    11 }
    12 int n,cur,len;
    13 rope<char> a,b,tmp;
    14 char s[2000005],rs[2000005];
    15 int main()
    16 {
    17     n=read();
    18     int x;
    19     while(n--)
    20     {
    21         scanf("%s",s);
    22         switch(s[0])
    23         {
    24             case 'M':cur=read();break;
    25             case 'P':cur--;break;
    26             case 'N':cur++;break;
    27             case 'G':printf("%c
    ",a[cur]);break;
    28             case 'I':
    29                 x=read();len=a.length();
    30                 for(int i=0;i<x;i++)
    31                 {
    32                     s[i]=getchar();
    33                     while(s[i]=='
    ') s[i]=getchar();
    34                     rs[x-i-1]=s[i];
    35                 }
    36                 rs[x]=s[x]=0;
    37                 a.insert(cur,s);
    38                 b.insert(len-cur,rs);
    39                 break;
    40             case 'D':
    41                 x=read();len=a.length();
    42                 a.erase(cur,x);
    43                 b.erase(len-cur-x,x);
    44                 break;
    45             case 'R':
    46                 x=read();len=a.length();
    47                 tmp=a.substr(cur,x);
    48                 a=a.substr(0,cur)+b.substr(len-cur-x,x)+a.substr(cur+x,len-cur-x);
    49                 b=b.substr(0,len-cur-x)+tmp+b.substr(len-cur,cur);
    50                 break;
    51         }
    52     }
    53     return 0;
    54 }

     Rope被称为可持久化平衡树,是因为它可以:

    rope<char>*a,*b;
    a=new rope<char>;
    b=new rope<char>(*a);

    或者

    his[i]=new rope<char>(*his[i-1]);

    也就是O(1)拷贝历史版本的平衡树,很完美的一个可持久化平衡树但是呢,数值操作不支持

    我也不知道底层是用块状链表实现的还是用平衡树实现的,复杂度到底是根号还是对数不好说

  • 相关阅读:
    iOS开发拓展篇—音频处理(音乐播放器5)
    在Unity中接入Xbox360手柄
    POJ 2531 Network Saboteur(DFS)
    小塔1024实现
    Cocos2dx--开发环境搭建
    2.7 视图合并
    Cocos2d-X开发中国象棋《四》设计游戏场景
    libsqlite3.dylib与libsqlite3.0.dylib的差别
    AsyncTask
    开发,从需求出发 &#183; 之二 造飞机的工厂
  • 原文地址:https://www.cnblogs.com/aininot260/p/9512661.html
Copyright © 2020-2023  润新知