zoukankan      html  css  js  c++  java
  • 【bzoj1269】[AHOI2006]文本编辑器editor

    在bzoj上乱翻,发现了可持久化并查集,然后baidu了一下,发现一种叫rope的东西。

     
    !!!真的太爽了!!!
     
    直接上代码,感受一下(也是蒯来的)。
     
     
     
    由于rope的底层实现,insert,erase,get都是logn的

    就是翻转不行,不是自己手写的打不了标记。

     

    rope的部分简单操作

    函数 功能
    push_back(x) 在末尾添加x
    insert(pos,x) 在pos插入x
    erase(pos,x) 从pos开始删除x个
    replace(pos,x) 从pos开始换成x
    substr(pos,x) 提取pos开始x个
    at(x)/[x] 访问第x个元素

     
    参考博客:http://blog.csdn.net/iamzky/article/details/38348653
     1 #include<algorithm>
     2 #include<ext/rope>
     3 #include<iostream>
     4 #include<cstdlib>
     5 #include<cstring>
     6 #include<cstdio>
     7 #include<cmath>
     8 #include<queue>
     9 #include<set>
    10 using namespace __gnu_cxx;
    11 using namespace std;
    12  
    13 #define N 2000010
    14  
    15 crope a,b,tmp;
    16  
    17 char str[N],rstr[N];
    18  
    19 char ch[10];
    20  
    21 int n;
    22 int k,len,s;
    23  
    24 int main()
    25 {
    26     scanf("%d",&n);
    27     while (n--)
    28     {
    29         scanf("%s",ch);
    30         switch (ch[0])
    31         {
    32             case 'M':
    33                 scanf("%d",&k);
    34                 break;
    35             case 'P':
    36                 k--;
    37                 break;
    38             case 'N':
    39                 k++;
    40                 break;
    41             case 'G':
    42                 putchar(a[k]);
    43                 putchar('
    ');
    44                 break;
    45             case 'I':
    46                 scanf("%d",&s);
    47                 len=a.length();
    48                 for (int i=0;i<s;i++)
    49                 {
    50                     do
    51                     {
    52                         str[i]=getchar();
    53                     }while (str[i]=='
    ');
    54                     rstr[s-i-1]=str[i];
    55                 }
    56                 rstr[s]=str[s]=''; 
    57                 a.insert(k,str); 
    58                 b.insert(len-k,rstr); 
    59                 break; 
    60             case 'D':
    61                 scanf("%d",&s); 
    62                 len=a.size(); 
    63                 a.erase(k,s); 
    64                 b.erase(len-k-s,s); 
    65                 break; 
    66             case 'R':
    67                 scanf("%d",&s); 
    68                 len=a.size(); 
    69                 tmp=a.substr(k,s); 
    70                 a=a.substr(0,k)+b.substr(len-k-s,s)+a.substr(k+s,len-k-s); 
    71                 b=b.substr(0,len-k-s)+tmp+b.substr(len-k,k);                
    72                 break;
    73         }
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    高地址,低地址:
    大小端
    大小端
    linux下C语言编程解决warning : incompatible implicit declaration of built-in function问题
    给char赋16进制
    go channel 概述
    vue2.x入门学习
    vue-cli安装记录
    maven常用Java配置
    activiti工作流引擎
  • 原文地址:https://www.cnblogs.com/yangjiyuan/p/5321191.html
Copyright © 2011-2022 走看看