当前位置: 首页 > 编程日记 > 正文

NOI2003文本编辑器

problem

传送门

Solution

块状链表板子题……

码了一下午,调了一晚上,代码重构了3遍,在终于过了。

还是太菜了。

移动光标的操作直接模拟即可。

插入操作,先将光标所在块分裂成两块,然后直接插入。

删除操作直接将边角料变成新块,然后相互连接。

细节有点多……

第一次打,代码奇丑,而且没有优化空间……

算了,以后在填坑吧……

Code

#include <bits/stdc++.h>using namespace std;#define DEBUG(...) fprintf(stderr, __VA_ARGS__)
#define mp make_pair
#define fst first
#define snd secondtemplate<typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }inline int read(){int res = 0, fl = 1;char r = getchar();for (; !isdigit(r); r = getchar()) if(r == '-') fl = -1;for (; isdigit(r); r = getchar()) res = (res << 3) + (res << 1) + r - 48;return res * fl;
}
typedef long long LL;
typedef pair<int, int> pii;const int Maxl = 1024 * 1024 * 2, siz = Maxl / 500, blk = Maxl / siz;
char ch[Maxl + 10];
int cnt;struct node {int lst, nxt, len;short c[blk + 10];void putout(){ for (int i = 1; i <= len; ++i) putchar(c[i]);}void back(int C){ c[++len] = C;}
}B[siz << 6];
void check(){for (int id = 1; B[id].nxt; id = B[id].nxt){if(B[B[id].nxt].len + B[id].len <= blk){for (int i = 1; i <= B[B[id].nxt].len; ++i)B[id].back(B[B[id].nxt].c[i]);B[id].nxt = B[B[id].nxt].nxt;B[B[id].nxt].lst = id;}}
}
int find(int cur, int &Id){for (Id = 1; Id && cur > B[Id].len; Id = B[Id].nxt) cur -= B[Id].len;return cur;
}
void MakeBlock(int len,int Lst){int num = 1;B[++cnt].lst = Lst;B[Lst].nxt = cnt;for (int i = 1; i <= len; ++i){if(num * blk + 1 == i){B[cnt].nxt = cnt + 1;cnt++, num++;B[cnt].lst = cnt - 1;}B[cnt].back(ch[i]);}
}
char tmp[5000];
void Insert(int cur, int len){int Id;cur = find(cur, Id);int Nxt = B[Id].nxt, Lst = B[Id].lst;MakeBlock(len, Id);for (int i = 1; i <= B[Id].len - cur; ++i) ch[i] = B[Id].c[cur + i];MakeBlock(B[Id].len - cur, cnt);B[cnt].nxt = Nxt;B[Nxt].lst = cnt;B[Id].len = cur;check();
}
void put_out(int cur,int len){int Bid, Eid, ecur;ecur = find(cur + len, Eid);cur = find(cur, Bid);if(Bid == Eid){for (int i = cur + 1; i <= ecur; ++i) putchar(B[Bid].c[i]);putchar('\n');return;}for (int i = cur + 1; i <= B[Bid].len; ++i)putchar(B[Bid].c[i]);for (Bid = B[Bid].nxt; Bid != Eid; Bid = B[Bid].nxt)B[Bid].putout();for (int i = 1; i <= ecur; ++i) putchar(B[Bid].c[i]);putchar('\n');
}
void Erase(int cur, int len){int Bid, Eid, ecur;ecur = find(cur + len, Eid);cur = find(cur, Bid);if(Bid == Eid){int xz = 0;for (int i = 1; i <= cur; ++i) ch[++xz] = B[Bid].c[i];for (int i = ecur + 1; i <= B[Bid].len; ++i) ch[++xz] = B[Bid].c[i];for (int i = 1; i <= xz; ++i) B[Bid].c[i] = ch[i];B[Bid].len = xz;check();return ;}B[Bid].len = cur;int xz = 0;for (int i = ecur + 1; i <= B[Eid].len; ++i) B[Eid].c[++xz] = B[Eid].c[i];B[Eid].len = xz;B[Bid].nxt = Eid;B[Eid].lst = Bid;check();
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("a.in", "r", stdin);freopen("a.out", "w", stdout);
#endifint t = read(), cur = 0;char opt[10];MakeBlock(blk, 0);while(t--){scanf("%s",opt + 1);if(opt[1] == 'M') cur = read();if(opt[1] == 'P') cur--;if(opt[1] == 'N') cur++;if(opt[1] == 'D') Erase(cur, read());if(opt[1] == 'G') put_out(cur, read());if(opt[1] == 'I'){int len = read();for (int i = 1; i <= len; ++i){ch[i] = getchar();if(ch[i] < 32 || ch[i] > 126) i--;}Insert(cur, len);}}return 0;
}

转载于:https://www.cnblogs.com/LZYcaiji/p/10397865.html

相关文章:

spark编程基础--2.4函数式编程基础

foreach遍历操作 映射操作map,flatmap 过滤操作filter 规约操作 reduce,fold方法 拆分操作partition,groupedBy,grouped,sliding Scala入门&#xff1a;函数式编程实例WordCount import java.io.File import scala.io.Source import collection.mutable.Map object WordCount …

开始一点点写博客

今天被老樊问了几个基础的问题&#xff0c;都没回答上来&#xff01;惭愧啊&#xff01;所以决定用博客的方式来记录在学习中的问题以便好复习&#xff0c;增强记忆&#xff01;转载于:https://www.cnblogs.com/MoShin/archive/2008/11/29/1343593.html

无人值守安装win2003+sp2的补丁

1. 无人值守安装win2003sp2的补丁<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />2. 思路&#xff1a; l 第一我们做把sp2的补丁集成到win2003的光盘中l 创建生成无人值守并加载到光盘中l …

构建安全的 ASP.NET 网页和控件

本页内容 本模块内容目标适用范围如何使用本模块威胁和对策设计注意事项输入验证跨站点脚本身份验证授权模拟敏感数据会话管理参数处理异常管理审核和日志记录小结其他资源本模块内容 Web 页和控件位于应用程序的防御前线&#xff0c;它们很容易受到蓄意破坏应用程序安全的攻击…

IDEA新建一个多maven模块工程(有图)

对于一些大型的项目来说&#xff0c;将项目的各个模块理清并进行管理&#xff0c;便于后续项目的维护&#xff0c;使用maven管理是很方便的&#xff0c;它可以很好的构建模块来设计项目的整体结构&#xff0c;对一些小型的项目不建议使用 1、新建父maven模块&#xff08;idea版…

windows10上使用一个tomcat部署2个项目

前言&#xff1a;目前想在本机部署2个项目&#xff0c;网上查了之后&#xff0c;写下本篇随笔 1、准备工作 2、操作方法 3、运行2个项目 1、准备工作 2个war包&#xff08;一个jprss.war和一个jenkins.war&#xff09; 1个tomcat环境 2、操作方法 第一步&#xff1a;复制tomcat…

spark编程基础--4.2在spark-shell中运行代码

启动spark-shell Spark2.1.0入门&#xff1a;Spark的安装和使用 通过spark-submit运行程序

不经历风雨,怎么能见彩虹!马克斯与我的不解之缘!

从***到站长总结经验&#xff08;让你IP飞速飙升的秘诀&#xff09;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />第一章&#xff1a;站长的梦想&#xff01;&#xff01;&#xff01;接触网络比较早&#xff0c;但是真正学到…

centos安装pg以及pg配置ssl

https://blog.csdn.net/iteye_21194/article/details/82645389 https://blog.csdn.net/rudy5348/article/details/79299162 https://yq.aliyun.com/articles/187转载于:https://www.cnblogs.com/diyunpeng/p/10398642.html

使用sbt编译打包,spark-submit命令提交的详细步骤

Spark2.1.0入门&#xff1a;Spark的安装和使用 使用sbt打包Scala程序 该程序依赖 Spark API&#xff0c;因此我们需要通过 sbt 进行编译打包。 请在./sparkapp 中新建文件 simple.sbt&#xff08;vim ./sparkapp/simple.sbt&#xff09;&#xff0c;添加内容如下&#xff0c;…

Tomcat异常退出

tomcat正常运行期间&#xff0c;会出现这样的报错&#xff0c;于是在网上搜了一下&#xff0c;发现有前辈&#xff0c;已找到解决办法&#xff0c;碎不甚明白其中缘由&#xff0c;但先记下&#xff0c;日后深研究&#xff1a; 我的机器的报错内容&#xff1a; SEVERE: Error pr…

[转载]前端工程师应该关注什么

克军发的一张图&#xff0c;汗死我了。http://farm4.static.flickr.com/3025/3114605967_248a0da171_o.png 转载于:https://www.cnblogs.com/cly84920/archive/2008/12/17/4427051.html

组策略分发软件全攻略

组策略分发软件全攻略 在规模比较大的网络环境里面&#xff0c;为了对服务器和客户机上的软件、系统补丁进行集中统一的管理&#xff0c;我们可能会用到SUS、WSUS、SMS等。SUS、WSUS管理系统更新&#xff0c;不在本文讨论&#xff0c;请参考其它相关技术文档。虽然SMS功能较强大…

Saiku二次开发获取源代码在本地编译(五)

关于Saiku的二次开发&#xff0c;在本地编译然后启动自己编译好的Saiku服务 Saiku是开源的&#xff0c;从github上能下载源代码&#xff0c;本例中的saiku源码也是从github上找的&#xff0c;然后自己改了一些pom.xml&#xff0c;以及其它调整。 当前提供的saiku版本为 3.9 一、…

As3.0 一些好书连接

优秀RIA书籍教程推荐与交流平台 http://www.riabook.cn/ 这里有很多不错的书。希望你们有帮助 转载于:https://www.cnblogs.com/guoyiqi/archive/2008/12/19/2069462.html

spark编程基础--5.1RDD编程基础

RDD创建 1.从文件系统中加载数据创建RDD 2.从分布式文件系统HDFS中加载数据 3.通过并行集合&#xff08;数组&#xff09;创建RDD RDD操作 1.转换操作 filter(func) map(func) flatmap(func) groupByKey() reduceByKey(func) 2.行动操作 3.惰性机制 所谓的“惰性机制”是指&…

JMeter的安装和使用

开始学习JMeter&#xff0c;网上资源虽多&#xff0c;不如自己总结的更有意义。 1. JMeter 的安装&#xff1a; 首先要安装java&#xff0c;这个直接去官网下载安装然后添加环境变量即可https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/ &#xff0c;下载JMeter…

C# 3.0 —— 扩展方法

扩展方法是C# 3.0新加入的特性&#xff0c;允许我们在不改变源代码的情况下扩展&#xff08;即填加&#xff09;现有类型中的实例方法&#xff0c;也给我们提供了另外一种扩展类型行为的方法(其它的方法为继承、组合、反射)。 下面我们来看一个代码示例&#xff1a; classProgr…

Melkman's Algorithm

http://cgm.cs.mcgill.ca/~athens/cs601/Melkman.html https://maxgoldste.in/melkman/ 转载于:https://www.cnblogs.com/noryes/p/10406873.html

HDU1051Wooden Sticks

Wooden Sticks http://acm.hdu.edu.cn/showproblem.php?pid1051 #include<stdio.h> struct stick{ int w ; int l; int flag;}wood[5000],temp,r[]; int n ; //排序// int partition(struct stick r[],int first,int end){ int ifirst,jend; while(i<j){ while(i<…

spark编程基础--5.2键值对RDD

键值对RDD的创建 常用的键值对转换操作 reduceByKey(func) groupByKey() keys values sortByKey() mapValues(func) join combineByKey reduceByKey(func) reduceByKey(func)的功能是&#xff0c;使用func函数合并具有相同键的值 groupByKey() 上面得到的wordCountsWithReduce…

禁止选中文本事件

由于经常会些写错&#xff0c;为了以后节约时间&#xff0c;记录下&#xff1a; obj.on(click,.arrow,function(ev){console.log(click);ev.stopPropagation();ev.preventDefault();var rel $(this).attr(rel);if( rel && rel < totalPage && rel>0 ){g…

一套外企的数据库设计面试题

最近发现园子里面关于数据库方面的文章比较多&#xff0c;正好我也是一个喜欢凑热闹的家伙&#xff0c;那就跟着烧一把火吧。^_^ 这是前阵子一个朋友面试外企的一套关于数据库设计的试题&#xff0c;有兴趣的朋友不妨一试。 Part I 工厂在定义一个新产品的流程如下&#x…

持续集成(一)为什么我们迫切需要持续集成

摘录自&#xff1a;http://blog.csdn.net/kkkloveyou/article/details/53875987 为什么我们迫切需要持续集成&#xff08;Continuous Integration&#xff09; 持续集成&#xff08;Continuous Integration&#xff09;&#xff0c;也就是我们经常说的 CI&#xff0c;是现代软…

spark编程基础--5.3数据读写

文件数据读写 1.本地文件系统的数据读写 1&#xff09;从文件中读取数据创建RDD 2&#xff09;把RDD写入到文本文件中 2.分布式文件系统HDFS的数据读写 3. JSON文件的读取 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于ECMAScript规范的…

试用最新版本的live writer发一篇日志看看

之前装Vs2008想弄WPF的时候&#xff0c;根据网上的说明&#xff0c;找VS2008的SP1&#xff0c;windows SDK的时候颇费周折&#xff0c;虽然说微软上面可以直接下&#xff0c;但是我找了半天才找到&#xff0c;总是觉得麻烦。现在就把一些WPF的相关前期准备软件的地址发出来&…

守护网络安全,我们一直在努力

据外电消息&#xff0c;日前&#xff0c;一种通过发布有关北京奥运会虚假信息的邮件来传播新型网络病毒&#xff0c;正在席卷全球。报道中写道&#xff0c;一封号称内容有关“北京奥运会可能因四川大地震取消和延迟”的电子邮件成为了“新型蠕虫恶意***程序”的源头&#xff0c…

DELPHI 中 Window 消息大全使用详解

Window 消息大全使用详解导读&#xff1a; Delphi是Borland公司的一种面向对象的可视化软件开发工具。 Delphi集中了Visual C和Visual Basic两者的优点&#xff1a;容易上手、功能强大&#xff0c;特别是在界面设计、数据库编程、网络编程方面更有其独特的优势。 Delphi中的消息…

vue 在浏览器控制台怎么调试 谷歌插件vue Devtools

vue 在浏览器控制台怎么调试 谷歌插件vue Devtools 问题&#xff1a; vuejs里面的变量&#xff0c;怎么用浏览器的console查看&#xff1f; 例如&#xff0c;想在chrome里用console.log查看变量$data&#xff0c;会显示undefined。 解决方案: 再main.js里面声明window.Vue new…

spark编程基础--5.4综合实例

操作指令如下&#xff1a; cd /usr/local/hadoop./sbin/start-dfs.sh./bin/hdfs dfs -mkdir -p spark/mycode/rdd/TopN./bin/hdfs dfs -put /usr/local/spark/mycode/TopN_file1.txt spark/mycode/rdd/TopN ./bin/hdfs dfs -put /usr/local/spark/mycode/TopN_file2.txt spark…