POJ 2887:Big String ← 块状链表

【题目来源】
http://poj.org/problem?id=2887

【题目描述】
You are given a string and supposed to do some string manipulations.

【输入格式】
The first line of the input contains the initial string. You can assume that it is non-empty and its length does not exceed
1,000,000.
The second line contains the number of manipulation commands N (
0 < N ≤ 2,000). The following N lines describe a command each. The commands are in one of the two formats below:
(1)
I ch p: Insert a character ch before the p-th character of the current string. If p is larger than the length of the string, the character is appended to the end of the string.
(2)
Q p: Query the p-th character of the current string. The input ensures that the p-th character exists.
All characters in the input are digits or lowercase letters of the English alphabet.

【输出格式】
For each Q command output one line containing only the single character queried.

【输入样例】
ab
7
Q 1
I c 2
I d 4
I e 2
Q 5
I f 1
Q 3

【输出样例】
a
d
e

【算法分析】
● 顾名思义,
块状链表=分块+链表,或者理解为用链表串起来的分块。根据对分块最优性的思思,n 个数据分为 sqrt(n) 块,每块 sqrt(n) 个数据。
​​​​​​​​​​​● 块状链表结合了数组与链表的优势,优化了计算复杂度。
● POJ 不支持万能头文件 #include <bits/stdc++.h>。
​​​​​​​●​​​​​​​ 针对错误提示 
error C2668: 'sqrt' : ambiguous call to overloaded function 的解决方法,就是将代码 sz=sqrt(n); 中的 n 进行强制类型转换,修改为 sz=sqrt((double)n); 即可。

【算法代码一】

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;const int maxn=1e6+5;
const int maxm=1e3+5;
char str[maxn];
int block[maxm];
char ch[maxm][5*maxm];
int n,sz,cnt;void build() {sz=sqrt((double)n);cnt=(n+sz-1)/sz; //向上取整for(int i=0; i<n; i++) {ch[i/sz+1][block[i/sz+1]++]=str[i];}
}void insert(char c, int p) {int i;for(i=1; i<=cnt; i++) {if(p-block[i]<=0) break;p-=block[i];}if(i==cnt+1) {ch[cnt][block[cnt]++]=c;return ;}block[i]++;int len=strlen(ch[i]);for(int j=len-1; j>=p-1; j--) ch[i][j+1]=ch[i][j];ch[i][p-1]=c;
}void query(int p) {int i;for(i=1; i<=cnt; i++) {if(p-block[i]<=0) break;p-=block[i];}cout<<ch[i][p-1]<<endl;
}int main() {cin>>str;n=strlen(str);int T;cin>>T;build();while(T--) {char op, c;int num;cin>>op;if(op=='I') {cin>>c>>num;insert(c, num);} else {cin>>num;query(num);}}return 0;
}/*
in:
ab
7
Q 1
I c 2
I d 4
I e 2
Q 5
I f 1
Q 3out:
a
d
e
*/


【算法代码二】

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;const int maxn=1e6+5;
const int maxm=1e3+5;
char str[maxn];
int block[maxm];
char ch[maxm][5*maxm];
int n,sz,cnt;void build() {sz=sqrt((double)n);cnt=(n+sz-1)/sz; //向上取整for(int i=0; i<n; i++) {ch[i/sz+1][block[i/sz+1]++]=str[i];}
}void insert(char c, int p) {int i;for(i=1; i<=cnt; i++) {if(p-block[i]<=0) break;p-=block[i];}if(i==cnt+1) {ch[cnt][block[cnt]++]=c;return ;}block[i]++;int len=strlen(ch[i]);for(int j=len-1; j>=p-1; j--) ch[i][j+1]=ch[i][j];ch[i][p-1]=c;
}void query(int p) {int i;for(i=1; i<=cnt; i++) {if(p-block[i]<=0) break;p-=block[i];}printf("%c\n", ch[i][p-1]);
}int main() {scanf("%s", str);n=strlen(str);int T;scanf("%d", &T);build();while(T--) {char op[3], c[3];int num;scanf("%s", op);if(op[0]=='I') {scanf("%s %d", c, &num);insert(c[0], num);} else {scanf("%d", &num);query(num);}}return 0;
}/*
in:
ab
7
Q 1
I c 2
I d 4
I e 2
Q 5
I f 1
Q 3out:
a
d
e
*/




【参考文献】
https://www.cnblogs.com/fightfordream/p/6565816.html
https://blog.csdn.net/hnjzsyjyj/article/details/138955263
https://oi-wiki.org/ds/block-list/
https://www.cnblogs.com/nancheng58/p/10068136.html




 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/851114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于JSP的班级同学录网站

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 个人中心 同学录管…

Qt for android :解决requestperssion后无法马上访问设备的问题

描述 当需要访问到设备硬件时&#xff0c; 涉及到Android权限&#xff0c;所以需要进行权限申请&#xff0c; 申请完之后访问常常发现权限不足&#xff0c; 为什么呢&#xff1f; 1. 从Qt库角度看问题&#xff1a; 无论是 QCoreApplication::requestPermission [since 6.5] te…

确保数据一致性的技术

禁止其他人同时使用数据 互联网提供的服务是可以供大量用户同时访问的。此时&#xff0c;就要求即使多人同时引用同一数据&#xff0c;或者同时更新数据&#xff0c;也不会产生冲突并且可以顺利执行处理。这种处理方式被称为并发控制。 但是&#xff0c;如果多人同时操作同一数…

51单片机独立按键控制LED灯,按键按一次亮,再按一次灭

1、功能描述 独立按键控制LED灯&#xff0c;按键按一次亮&#xff0c;再按一次灭 2、实验原理 轻触按键:相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动米实现接通和断开&#xff1b;…

网络网络层之(6)ICMPv6协议

网络网络层之(6)ICMPv6协议 Author: Once Day Date: 2024年6月2日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CS…

WPF-UI布局

WPF布局元素有如下几个&#xff1a; Grid&#xff1a;网格。可以自定义行和列并通过行列的数量、行高和列宽来调整控件的布局。StackPanel&#xff1a;栈式面板。可将包含的元素在竖直或水平方向上排成一条直线&#xff0c;当移除一个元素后&#xff0c;后面的元素会自动向前移…

怎么使用useLayoutEffect

useLayoutEffect 是 React 中的一个 Hook,与 useEffect 类似,但它在浏览器绘制任何内容之前同步触发。这意味着,如果你需要在 DOM 更新后执行某些操作,并且这些操作可能会影响到组件的布局或渲染,那么使用 useLayoutEffect 会更合适。 以下是如何使用 useLayoutEffect 的…

SpringAI(二)

大模型:具有大规模参数和复杂计算结构的机器学习模型.通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数.其设计目的在于提高模型的表达能力和预测性能,应对复杂的任务和数据. SpringAI是一个AI工程领域的应用程序框架 大概推出时间是2023年7月份(不确定) 目的是将S…

细说NLP中的Embedding层

文章目录 前言一、为什么要引入Embedding层二、Embedding层是怎么发挥作用的&#xff1f;三、感受Embedding的强大四、为什么理解Embedding的底层原理&#xff1f;总结 前言 在构建高效的自然语言处理模型时&#xff0c;Embedding层是不可或缺的组成部分。它不仅可以帮助我们捕…

WPF Frame应用 实现页面跳转

需求&#xff1a; 有一个F0View主页面入口&#xff0c;三个子页面&#xff08;First.xaml/Second.xaml/Third.xaml&#xff09;用Frame默认加载第一个页面 First.xaml。实现三个页面之间顺序跳转&#xff0c;并且每个页面只初始化一次。 实现&#xff1a; 1&#xff0c;将三…

Apache Kylin的入门

Apache Kylin入门教程 一、Apache Kylin简介 Apache Kylin是一个开源的分布式分析引擎&#xff0c;提供Hadoop之上的SQL接口及多维分析&#xff08;OLAP&#xff09;能力&#xff0c;以支持超大规模数据。最初由eBay Inc. 开发并贡献至开源社区&#xff0c;能够在亚秒内查询巨…

14.《C语言》——【牛客网BC116—BC123题目讲解】

亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&#xff0c;成为一名优…

06.组件间通信-$refs(父传子)-$parent(子传父)

组件间通信- r e f s &#xff08;父传子&#xff09; − refs&#xff08;父传子&#xff09;- refs&#xff08;父传子&#xff09;−parent&#xff08;子传父&#xff09; 父组件&#xff1a; <template><div class"father"><h3>父组件</h…

标量、向量、矩阵、张量是什么?

参考视频&#xff1a;标量、向量、矩阵、张量-机器学习-李文哲AI人工智能培训_哔哩哔哩_bilibili 参考资料&#xff1a;深度学习基础&#xff1a;标量、向量、矩阵、张量_深度学习本质是矩阵-CSDN博客 标量是一个独立存在的数&#xff0c;比如线性代数中的一个实数5就可以被看…

嵌入式Linux系统编程 — 3.5 utime、utimes、futimens、utimensat函数修改文件时间属性

目录 1 文件的时间属性简介 2 utime()函数 2.1 utime()函数简介 2.2 示例程序 3 utimes()函数 3.1 utimes()函数简介 3.2 示例程序 4 futimens()函数 4.1 futimens()函数简介 4.2 示例程序 5 utimensat()函数 5.1 utimensat()函数简介 5.2 示例程序 1 文件的时间…

react修改本地运行项目的端口

一、描述 如果你想让项目在你想要的端口打开的话&#xff0c;就需要进行设置 二、代码 设置一下pages.json文件就可以了&#xff0c;如下&#xff1a; 如果想打开项目不需要点击下面的链接地址&#xff0c;让他运行npm run dev之后自己直接打开到浏览器的话&#xff0c;在后…

selenium自动化测试入门 —— 上传文件

selenium无法识别非web的控件&#xff0c;上传文件窗口为系统自带&#xff0c;无法识别窗口元素。 上传文件有两种场景&#xff1a;input控制上传和非input控件上传。 大多数情况都是input控件上传文件&#xff0c;只有非常少数的使用自定义的非input上传文件。 一、input控…

2003远程桌面端口修改,远程桌面端口修改的方法有哪些

方法一&#xff1a;通过修改注册表 1、打开注册表编辑器&#xff1a; 打开“开始”菜单&#xff0c;点击“运行”&#xff0c;输入“regedit”&#xff0c;然后按下“Enter”键。 2、导航到远程桌面服务的注册表项&#xff1a; 依次展开以下路径&#xff1a; HKEY_LOCAL_M…

python 获取网页链接图片

python 获取 网页图片 在Python中&#xff0c;可以使用requests库获取网页内容&#xff0c;再使用BeautifulSoup解析网页&#xff0c;提取图片链接&#xff0c;最后保存图片到本地。以下是一个简单的例子&#xff1a; import requests from bs4 import BeautifulSoup import o…

小程序名片怎么生成?AI名片生成器源码系统 为企业店铺创建自己的数字名片

在数字化时代&#xff0c;小程序名片已经成为企业店铺展示自身形象、推广产品和服务的重要工具。分享一个AI名片生成器源码系统春哥AI雷达智能名片小程序系统企业商业运营版&#xff0c;含完整代码包和详细的图文安装部署搭建教程&#xff0c;新手也能轻松使用&#xff0c;源码…