传送门

看了看块状链表,就是数组和链表的合体。

看上去好高大尚,思想也很简单。

但是发现代码量也不是很小,而且代码理解起来也是费尽得很,倒不如splay用起来顺手。

在加上适用范围貌似不是特别广,所以只把模板贴在这,只当了解思想,暂时先不使用。(也不会用啊)

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<queue>
  5. using namespace std;
  6.  
  7. const int N=<<;
  8. const int blocksize=;
  9. const int blocknum=N/blocksize*;
  10.  
  11. int T,_;
  12. int cur;
  13. char str[],opt[];
  14. queue <int> q;
  15. struct node
  16. {
  17. char data[blocksize+];
  18. int len,nxt;
  19. }a[blocknum+];
  20.  
  21. void init()
  22. {
  23. for (int i=;i<=blocknum;++i) q.push(i);
  24. a[].len=; a[].nxt=-;
  25. }
  26. void read(int len)
  27. {
  28. int i=-;
  29. while (i<len-)
  30. {
  31. i++;
  32. char c=getchar();
  33. str[i]=c;
  34. if (c<||c>) i--;
  35. }
  36. }
  37. //新开一个块的节点
  38. int newnode()
  39. {
  40. int temp=q.front(); q.pop();
  41. return temp;
  42. }
  43. //回收块的节点
  44. void delnode(int t)
  45. {
  46. q.push(t);
  47. }
  48. //找到pos所在的块,并使pos表示在当前块中的位置
  49. void find(int &pos,int &now)
  50. {
  51. for (now=;a[now].nxt!=-&&pos>a[now].len;now=a[now].nxt)
  52. pos-=a[now].len;
  53. }
  54. //将新快赋值
  55. void fillnode(int pos,int n,char data[],int nxt)
  56. {
  57. a[pos].nxt=nxt; a[pos].len=n;
  58. memcpy(a[pos].data,data,n);
  59. }
  60. //将块pos在p位置前后分开,变成两个块
  61. void split(int pos,int p)
  62. {
  63. if (a[pos].len==p) return;
  64. int t=newnode();
  65. fillnode(t,a[pos].len-p,a[pos].data+p,a[pos].nxt);
  66. a[pos].nxt=t; a[pos].len=p;
  67. }
  68. //把碎块合并
  69. void maintain(int pos)
  70. {
  71. int t;
  72. for (;pos!=-;pos=a[pos].nxt)
  73. for (t=a[pos].nxt;t!=-&&a[pos].len+a[t].len<blocksize;t=a[t].nxt)
  74. {
  75. memcpy(a[pos].data+a[pos].len,a[t].data,a[t].len);
  76. a[pos].len+=a[t].len; a[pos].nxt=a[t].nxt; delnode(t);
  77. }
  78. }
  79. //在光标pos处插入长度为n的str
  80. void insert(int pos,int n)
  81. {
  82. int now,i,t;
  83. //now表示光标所在的块,pos表示光标在这个块中的位置
  84. find(pos,now);
  85. split(now,pos);
  86. for (i=;i+blocksize<=n;i+=blocksize)
  87. {
  88. t=newnode();
  89. fillnode(t,blocksize,str+i,a[now].nxt);
  90. a[now].nxt=t;
  91. now=t;
  92. }
  93. if (i<n)
  94. {
  95. t=newnode();
  96. fillnode(t,n-i,str+i,a[now].nxt);
  97. a[now].nxt=t;
  98. }
  99. maintain(now);
  100. }
  101. //从光标pos开始删除长度为n的字符串
  102. void del(int pos,int n)
  103. {
  104. int i,now,t;
  105. //now表示光标所在的块,pos表示光标在这个块中的位置
  106. find(pos,now);
  107. split(now,pos);
  108. //找到删除的末尾的点所处的块
  109. for (i=a[now].nxt;i!=-&&n>a[i].len;i=a[i].nxt)
  110. n-=a[i].len;
  111. split(i,n); i=a[i].nxt;
  112. for (t=a[now].nxt;t!=i;t=a[now].nxt)
  113. a[now].nxt=a[t].nxt,delnode(t);
  114. maintain(now);
  115. }
  116. //从pos这个位置开始输出长度为n的字符串
  117. void get(int pos,int n)
  118. {
  119. int i,now,t;
  120. find(pos,now);
  121. i=min(n,a[now].len-pos);
  122. memcpy(str,a[now].data+pos,i);
  123. for (t=a[now].nxt;t!=-&&i+a[t].len<=n;t=a[t].nxt)
  124. {
  125. memcpy(str+i,a[t].data,a[t].len);
  126. i+=a[t].len;
  127. }
  128. if (i<n&&t!=-) memcpy(str+i,a[t].data,n-i);
  129. str[n]=;
  130. }
  131. int main()
  132. {
  133. init();
  134. scanf("%d",&T);
  135. while (T--)
  136. {
  137. scanf("%s",opt);
  138. if (opt[]=='M') scanf("%d",&cur);//改变光标的位置
  139. if (opt[]=='I')//插入一段区间
  140. {
  141. scanf("%d",&_);
  142. read(_);
  143. insert(cur,_);
  144. }
  145. if (opt[]=='P') cur--;//光标左移
  146. if (opt[]=='N') cur++;//光标右移
  147. if (opt[]=='D')//删除一段区间
  148. {
  149. scanf("%d",&_);
  150. del(cur,_);
  151. }
  152. if (opt[]=='G')//输出一段区间
  153. {
  154. scanf("%d",&_);
  155. get(cur,_);
  156. puts(str);
  157. }
  158. }
  159. }

[NOI2003]Editor(块状链表)的更多相关文章

  1. 【BZOJ-1507】Editor 块状链表

    1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 3397  Solved: 1360[Submit][Stat ...

  2. 【BZOJ 1507】【NOI 2003】&【Tyvj P2388】Editor 块状链表模板题

    2016-06-18 当时关于块状链表的想法是错误的,之前维护的是一个动态的$\sqrt{n}$,所以常数巨大,今天才知道原因TwT,请不要参照这个程序为模板!!! 模板题水啊水~~~ 第一次写块状链 ...

  3. 洛谷.4008.[NOI2003]editor文本编辑器(块状链表)

    题目链接 st(n)表示sqrt(n) 为使块状链表不会退化,通常将每块的大小S维持在[st(n)/2,2st(n)]中,这样块数C也一定[st(n)/2,2st(n)]中 在此使用另一种方法(方便) ...

  4. 1507: [NOI2003]Editor(块状链表)

    1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4157  Solved: 1677[Submit][Stat ...

  5. BZOJ 1507 Editor(块状链表)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1507 题意:一个文本编辑器,模拟以下操作: 思路:块状链表的主要操作: (1)find( ...

  6. luogu P4008 [NOI2003]文本编辑器 splay 块状链表

    LINK:文本编辑器 这个东西感觉块状链表写细节挺多 (块状链表本来就难写 解释一下块状链表的做法:其实是一个个数组块 然后利用链表给链接起来 每个块的大小为sqrt(n). 这样插入删除的时候直接暴 ...

  7. 1507: [NOI2003]Editor

    1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 3535  Solved: 1435 [Submit][St ...

  8. ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)

    题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...

  9. POJ 2887 Big String(块状链表)

    题目大意 给一个字符串,长度不超过 106,有两种操作: 1. 在第 i 个字符的前面添加一个字符 ch 2. 查询第 k 个位置是什么字符 操作的总数不超过 2000 做法分析 好多不同的做法都可以 ...

随机推荐

  1. qconshanghai2016

    http://2016.qconshanghai.com/schedule 大会日程 2016年10月20日 星期四 07:45 开始签到 09:00 开场致辞 专题 前端技术实践 主题演讲 业务上云 ...

  2. 组件的 state 和 setState

    state 我们前面提到过,一个组件的显示形态是可以由它数据状态和配置参数决定的.一个组件可以拥有自己的状态,就像一个点赞按钮,可以有“已点赞”和“未点赞”状态,并且可以在这两种状态之间进行切换.Re ...

  3. Bean with name 'xxxService' has been injected into other beans [xxxServiceA,xxxServiceB] in its raw version as part of a circular reference, but has eventually been wrapped

    启动项目,通过@Autowired注入对象,出现循环依赖,导致项目启动失败,具体报错信息如下: Exception encountered during context initialization ...

  4. Javaweb学习笔记10—文件上传与下载

    今天来讲javaweb的第10阶段学习.文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦. 老规矩,首先先用一张思维导图来展现今天的博客内容.       ...

  5. IE8 window.open 不支持此接口 的问题解决

    在使用vs2010调试代码时,突然出现 window.open 不支持此接口的提示,开始认为是不是vs的问题,后来上网查询说是系统问题.我不想重装系统,之后发现是IE的问题,使用其他浏览器浏览系统不会 ...

  6. 利用Jenkins打包ISO和QCOW2镜像文件

    现在的云虚拟化环境越来越多,经常会碰到需要修改并重新打包新的ISO或QCOW2镜像文件.通过手工的方式会比较麻烦,所以在镜像发布的生产环境中可以利用Jenkins来进行定期打包发布,以下介绍Jenki ...

  7. 如何在Ubuntu里安装Helm

    Helm是什么?在战网上玩过暗黑破坏神2代的程序员们应该还记得,Helm是国度的意思. 而在计算机领域,Helm是什么? Helm是Kubernetes的一个包管理工具,有点像nodejs的npm,U ...

  8. javaee 第五周作业

    一.Ajax技术 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. ...

  9. XtraBackUp 热备份工具

    是一款强大的在线热备份工具 备份的过程中,不锁表 使用percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm yum源安装: 1.安装Percona的库:       ...

  10. c语言 错误记录

    1.预处理错误 #include <>   //系统内部的 #include ""   // 自定义的 遇到 not find------解决方案:gcc -I 跟查找 ...