首页 > 其他分享 >NOI2003 文本编辑器 题解

NOI2003 文本编辑器 题解

时间:2023-01-07 12:22:05浏览次数:67  
标签:文本编辑 ch int 题解 pos len rope NOI2003

\STL大法好/


正规解法块状链表,这里采取的是黑科技解法。

rope是扩展STL库中的一个数据结构——可持久化平衡树,相比较set,它更适合区间插入和删除。这里用来解此题,就显得十分傻瓜容易了。

头文件:#include <ext/rope>

命名空间:using namespace __gnu_cxx;

基本操作:

insert(pos, s)将字符串s插入pos位置

erase(pos, num)从pos开始删除num个字符

copy(pos, len, s)从pos开始len个字符用s代替

substr(pos, len)提取pos开始的len个字符

at(x)访问第x个元素

几乎跟题目一模一样!

更开心的是,rope在NOI中是允许使用的(hooray)!

于是代码就十分简单了:

#include <bits/stdc++.h>
#include <ext/rope>

using namespace __gnu_cxx;
using namespace std;

rope <char> editor;

char ch;
string oper;
int pos, n, rela;

int main()
{
	cin.tie(0);
	cout.tie(0);
	
	scanf("%d", &n);
	
	while(n--)
	{
	    cin >> oper;
	    scanf("%d", &rela);
	    
		if(oper =="Insert"){
		    int pos1 = pos;
			while(rela)
			{
				ch = getchar();
				if((int)ch >= 32 && (int)ch <= 126){
				    editor.insert(pos1, ch);
				    rela--;
				    pos1++;
				}
			}
        }
        
        else if(oper =="Move"){
        	pos = rela;
        }
        
        else if(oper =="Next"){
            pos++;
        }
        
        else if(oper =="Prev"){
        	pos--;
        }
        
        else if(oper =="Get"){
        	cout << editor.substr(pos, rela) << endl;
        }
        
        else if(oper =="Delete"){
        	editor.erase(pos, rela);
        }
	}
	return 0;
}

双倍经验 P4567 【AHOI2006】 文本编辑器

此题是上题的升级版,因为要实现rotate操作,所以存储两个rope,一正一反。

代码基本相同,略。

标签:文本编辑,ch,int,题解,pos,len,rope,NOI2003
From: https://www.cnblogs.com/sunruize/p/17032457.html

相关文章

  • CF1779C Least Prefix Sum 题解
    可能更好的阅读体验题目传送门题目大意给定一个序列\(a\),长度\(n\)。每次操作可以把\(a_i\)变成\(-a_i\)。要求\(a\)做前缀和之后的序列\(s\)中最小值为\(s......
  • CF1779D Boris and His Amazing Haircut 题解
    可能更好的阅读体验题目传送门题目翻译题目解析如果有\(a_i<b_i\)直接输出NO。我们发现:如果\(b_l=b_r=x\)并且所有的\(l\lei\ler\)都有\(b_i\lex\)那么......
  • CF1779A Hall of Fame 题解
    可能更好的阅读体验题目传送门题目翻译有\(n\)个纪念碑以及对应的\(n\)个台灯。给定一个由L和R组成的序列\(a\),代表台灯的朝向。如果第\(i\)个台灯为L,代......
  • 【题解】P4027 [NOI2007] 货币兑换
    题意好长,但是不想概括了。\cdq/!思路cdq分治+凸包。首先考虑令\(f_i\)表示第\(i\)天可以得到的最大金额,\(f_1=s\)因为\(rate_i\)是常数,并且保证存在最优方......
  • 【题解】CF1178G The Awesomest Vertex
    题意给定一棵大小为\(n\)的树以及\(m\)个操作,定义一个结点\(u\)的权值为:\(|\sum\limits_{w\inR(v)}a_w|\cdot|\sum\limits_{w\inR(v)}b_w|\)其中\(R(v)......
  • 230102模拟题解
    t1容易发现对于奇数和偶数,能满足条件的长度分别是单调的,所以可以分别二分答案检查。检查的时候对于差分序列做哈希即可,然后用set/map/哈希表判\(B\)的子段是否有\(A......
  • CF865B Ordering Pizza 题解
    简要题意:有\(n\)个人去披萨店吃披萨,有两种披萨,每个披萨有\(m\)片。现在第\(i\)个人要吃\(c_i\)片披萨,如果吃一片第一种披萨会获得\(a_i\)的幸运值,如果吃一片第二......
  • configmap出现/n问题解决
    1.现象原始文件肉眼显示正常,如下图命令行显示整个data部分成了一坨,回车全变成了/n,虽然不影响使用,但是对维护查看比较麻烦,如下图2.问题原因1.配置文件里有一些Tab......
  • [CTSC2009]魔幻花园 题解
    [CTSC2009]魔幻花园题解洛谷链接。一、问题转化原问题等价于求某个水平面上所有点围成凸包的面积的最小值。首先考虑把三维问题转化到二维上:考虑到任意时刻所有点都在......
  • I. 西行妖下题解
    题目内容原题链接样例输入5201样例输出?44232?35155?52431!32154题解首先,题目有一个很难解决的痛点,就是他只会返回最前面的那......