problem

给一个字符串,长度不超过 1e6,有两种操作:

  1. 在第 i 个字符的前面添加一个字符 ch
  2. 查询第 k 个位置是什么字符

操作的总数不超过 2000

solution

1、传统的数组所有数据在内存中是紧凑储存的,优点是定位快:O(1),缺点是修改慢:O(n)
2、传统的链表每个节点只记录一个字符,优缺点与数组正好相反:定位慢 O(n),修改快 O(1)
3、块状链表的每个节点记录的是 sqrt(n) 个信息,一个长度为 n 的字符串就被分成了 sqrt(n) 个。这样,查询和插入字符的操作就变成了 sqrt(n)级别的了,对于这题 2000 个操作来讲,时间复杂度还能忍受
4、在实际应用中,需维持块状链表的每个结点大小在[sqrt(n)/2,2∗sqrt(n)],否则时间会退化的很厉害。(超过了就将一个结点分裂成两个)

codes

#include<cstdio>
#include<cstring>
const int maxn = 2000, maxlen = 1e6+10;//sqrt(1e6)struct Block_List{struct Node{char buff[maxn];int size, next;void init(){size = 0, next = -1;memset(buff,0,sizeof(buff));}}List[maxn];int head, tot;void init(char s[]){head = tot = 0;List[tot++].init();int cur = 0;for(int i = head; s[cur]; i = List[i].next){for(int j = 0; j < maxn && s[cur]; j++,cur++){List[i].buff[j] = s[cur];List[i].size++;}if(s[cur]){List[tot].init();List[i].next = tot++;}}for(int i = head; i!=-1; i = List[i].next)if(List[i].size==maxn)Split(i);}void Split(int id){List[tot].init();for(int i = maxn/2; i < maxn; i++){List[tot].buff[i-maxn/2] = List[id].buff[i];List[tot].size++;List[id].buff[i] = 0;List[id].size--;}List[tot].next = List[id].next;List[id].next = tot++;}void Insert(int pos, char val){int i;for(i = head; pos > List[i].size && List[i].next != -1; i = List[i].next)pos -= List[i].size;if(pos >= List[i].size)List[i].buff[List[i].size] = val;else {for(int j = List[i].size; j > pos; j--)List[i].buff[j] = List[i].buff[j-1];List[i].buff[pos] = val;}List[i].size++;if(List[i].size==maxn)Split(i);}char Find(int pos){int i;for(i = head; pos > List[i].size; i = List[i].next)pos -= List[i].size;return List[i].buff[pos-1];}
}Meow;char op[2], buff[maxlen];
int pos;int main(){scanf("%s",buff);Meow.init(buff);int n;  scanf("%d",&n);for(int i = 0; i < n; i++){scanf("%s",op);if(op[0]=='I'){scanf("%s%d",buff,&pos);Meow.Insert(pos-1,buff[0]);}else {scanf("%d",&pos);printf("%c\n",Meow.Find(pos));}}return 0;
}

【POJ2887】Big String(块状链表,模板)相关推荐

  1. Splay ---- 2018牛客多校第三场 区间翻转搞区间位移 或者 rope可持久化块状链表

    题目链接 题目大意: 就是每次把牌堆中若干个连续的牌放到堆顶,问你最后牌的序列. 解题思路: Splay 区间翻转的模板题: 对于一个区间[1,2,3,4,5,6,7,8][1,2,3,4,5,6,7 ...

  2. [BZOJ3337] ORZJRY I --块状链表大毒瘤

    link 题目大意:维护一个序列 支持: 1.单点插入 2.单点删除 3.区间翻转 4.区间旋转 5.区间加 6.区间赋值 7.询问区间和 8.询问区间极差 9.询问区间与给定某个数差值绝对值的最小值 ...

  3. 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树

    让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...

  4. Python数据结构与算法(附录)——块状链表的动态调整

    Python数据结构与算法(附录)--块状链表的动态调整 块状链表的动态调整 违反规则 1 违反规则 2 相关链接 块状链表的动态调整 我们已经知道块状链表的块的最大容量会随着链表长度的变化动态改变, ...

  5. 【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)

    一.线性表 1.1 概念与特点 1.2 线性表的存储结构 1.3 常见操作 1.4 应用场景 二.链表 2.1 链表简介 2.2 单向链表(单链表) 2.21 基本概念 2.22 单链表基本操作 2. ...

  6. [AcWing]827. 双链表(C++实现)双链表模板题

    [AcWing]827. 双链表(C++实现)双链表模板题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总结 1. 题 ...

  7. 单链表模板类c++实现

    1.题目描述 实现课本中的带附加头结点的单链表模板类,完成如下功能: 定义链表节点的结构体类型,构造函数和析构函数,单链表的输入输出 引用型操作:getData,Locate ,Search,Leng ...

  8. Python数据结构与算法(2.6)——块状链表

    Python数据结构与算法(2.6)--块状链表 0. 学习目标 1. 块状链表简介 1.1 块状链表介绍 1.2 块状链表中结点类 1.3 块状链表中块类 2. 块状链表的实现 2.1 块状链表的初 ...

  9. 块状链表(STL rope)

    块状链表(STL rope) 首先介绍一下块状链表. 我们都知道: 数组 具有 O(1)的查询时间,O(N)的删除,O(N)的插入. 链表 具有 O(N)的查询时间,O(1)的删除,O(1)的插入. ...

最新文章

  1. 机器学习的入门平台天花板,还可免费实操经典教程,确实也没谁了
  2. XFS:大数据环境下Linux文件系统的未来
  3. 大战设计模式【16】—— 桥接模式
  4. 参加技术会议的一些小窍门
  5. SAP FI配置关键点
  6. C#中将字符串内容写入到txt文件中
  7. 学习笔记:Windows 下Keras安装和配置指南
  8. linux decode函数,Oracle 中 decode 函数用法
  9. oracle 11gR2 RAC root.sh 错误 ORA-15072 ORA-15018
  10. SpringBoot另一大神器-Actuator
  11. pandownload用户未登录_Pandownload再度复活,下载速度飙升到10MB/s以上
  12. java集合类中的迭代器
  13. StringUtil字符串小工具-功能扩展
  14. 代码格式化工具 Clang-format
  15. 关于hash(一):基本概念
  16. sql server无法用sql server身份验证
  17. Unity实现自适应屏幕大小——九宫格
  18. 174款前端开发工具汇总,学习,开发,事半功倍!
  19. MES系统多少钱?企业需要什么样的MES系统?
  20. 如何获取网络协议的协议号

热门文章

  1. Git 基础 —— 配置与日志信息
  2. 化学人学python有前途吗-从化学实验室到数据分析师,月薪翻倍后的转行经验总结!...
  3. python有趣小程序-Python里的17个quot;骚操作”好玩有趣
  4. 有道智云智能语音服务全面升级 最多可支持44种语言和方言
  5. 21个php常用方法汇总
  6. php获取用户当前坐标,web端定位:获取当前地理位置
  7. 魔天记服务器维护,魔天记3月23日维护公告
  8. 用户名、密码都有值激活提交按钮
  9. HTML-图像,音频,视频和路径
  10. LeetCode 230二叉搜索树中第k小的元素