zoukankan      html  css  js  c++  java
  • rope

    rope (类似于块状链表的结构)

    需要增加的预处理指令:
    #include<ext/rope>
    using namespace __gnu_cxx;
    rope<int> rp;

    基本操作:
    在末尾插入 (x) : rp.push_back(x);
    (pos) 处插入 (x) : rp.insert(pos, x);
    (pos) 处开始删除 (x) 个元素: rp.erase(pos, x);
    返回 (rp) 的大小: rp.length();rp.size();
    (pos) 处的元素替换成 (x): rp.replace(pos, x);
    获取从 (pos) 处开始的 (x) 个元素: rp.substr(pos, x);
    将从 (pos) 处开始的 (x) 个元素复制到 (s) 中: rp.copy(pos, x, s);
    访问第 (x) 个元素: rp[x];rp.at(x);

    拷贝历史版本:
    rope<int> *his[1000];
    his[i] = new rope<int> (*his[i - 1]);

    [AHOI2006]文本编辑器

    #include <bits/stdc++.h>
    #include <ext/rope>
    using namespace std;
    using namespace __gnu_cxx;
    
    const int N = 2e6 + 20;
     
    int n;
    int x, pos, len;
    char s[N], opt[10], revs[N];
    rope<char> a, b, tmp; 
    
    int main()
    {
    	scanf("%d", &n);
    	while(n -- )
    	{
    		scanf("%s", opt);
    		switch(opt[0])
    		{
    			case 'M': scanf("%d", &x); pos = x; break; 
    			case 'I': scanf("%d", &x); getchar(); len = a.size();
    					  for(int i = 0; i < x; ++ i)
    					  {
    					      s[i] = getchar();
    						  revs[x - 1 - i] = s[i];	 
    					  }
    					  revs[x] = s[x] = 0;
    					  a.insert(pos, s);
    					  b.insert(len - pos, revs);
    					  break;
    			case 'D': scanf("%d", &x); len = a.size();
    					  a.erase(pos, x);
    					  b.erase(len - pos - x, x);
    					  break;
    			case 'R': scanf("%d", &x); len = a.size();
    					  tmp = a.substr(pos, x);
    					  a = a.substr(0, pos) + b.substr(len - pos - x, x) + a.substr(pos + x, len - pos - x); 
                   		  b = b.substr(0, len - pos - x) + tmp + b.substr(len - pos, pos);  
                          break;  
    			case 'G': if(a[pos] != '
    ') printf("%c
    ", a[pos]);
    					  else puts(""); break;
    			case 'P': pos --; break;
    			case 'N': pos ++; break;
    		}
    	} 
    	return 0;
    }
    

    [NOI2003] 文本编辑器

    #include <bits/stdc++.h>
    #include <ext/rope>
    using namespace std;
    using namespace __gnu_cxx;
    
    const int N = 3e6 + 20;
     
    int n;
    int x, pos;
    char s[N], opt[10];
    rope<char> a; 
    
    int main()
    {
    	scanf("%d", &n);
    	while(n -- )
    	{
    		scanf("%s", opt);
    		switch(opt[0])
    		{
    			case 'M': scanf("%d", &x); pos = x; break; 
    			case 'I': scanf("%d", &x);  
    					  for(int i = 0; i < x; ++ i) 
    					  {
    					      s[i] = getchar();
    					  	  while(s[i] == '
    ' || s[i] == '
    ') s[i] = getchar();
    					  }
    					  s[x] = 0; a.insert(pos, s); break;
    			case 'D': scanf("%d", &x); a.erase(pos, x); break;  
    			case 'G': scanf("%d", &x); a.copy(pos, x, s); s[x] = 0; puts(s); break;
    			case 'P': pos --; break;
    			case 'N': pos ++; break;
    		}
    	} 
    	return 0;
    }
    
  • 相关阅读:
    Java开发中的一些小技巧
    Java后端WebSocket的Tomcat实现
    Spring事务配置的五种方式 -- 越往后需要Spring版本越高
    Spring事务管理 -- 挺好
    java List 排序 Collections.sort() 对 List 排序
    java List 排序 Collections.sort()
    Java获得文件的创建时间(精确到秒)
    [JSP] c:forEach 输出序号 每行自动生成序号
    Unity3D研究院之在开始学习拓展编辑器
    同样的代码在java和c++中结果不同
  • 原文地址:https://www.cnblogs.com/ooctober/p/14489778.html
Copyright © 2011-2022 走看看