POJ 2887 Big String (块状数组)
题意:给一个字符串(<=1000000)和n个操作(<2000),每个操作可以在某个位置插入一个字符,或者查询该位置的字符。问查询结果。
思路:块状数组。
如果将原来的字符串都存在一起,每次插入肯定会超时。
而操作数比较少,考虑使用分块法。假设原字符串长度为L,则取每块长度l=sqrt(L)。这样每次插入,我们需要用sqrt(L)的时间找到对应的块,再用sqrt(L)在该块进行插入。查询同样需要sqrt(L)找到该块,如果用数组实现可以O(1)找到目标元素。(我尝试用stl链表来做,结果超时了)
这样最坏的情况下,一个块最多有2000个字符,当然操作不会超时,但是数组要开得足够大。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <list>
#define ll long long
using namespace std;
int Maxn, N ;
];
struct BlockList
{
int size;
];
int at(int pos)
{
return dat[pos];
}
void insert(int pos,char c)
{
];
dat[pos]=c;
}
void push_back(char c)
{
dat[++size]=c;
}
};
BlockList block[];
char query(int s,int p)
{
return block[s].at(p);
}
void insert(int s,int p,char c)
{
p=min(p,block[s].size+);
block[s].insert(p,c);
}
void maintain()
{
; i<=Maxn; ++i)
sum[i]=sum[i-]+block[i].size;
}
void MyInsert(int pos,char c)
{
,sum++Maxn,pos)-(sum);
insert(p,pos-sum[p-],c);
maintain();
}
int MyQuery(int pos)
{
,sum++Maxn,pos)-(sum);
]);
}
];
void init()
{
int len=strlen(str)+N;
Maxn=sqrt(len*;
; str[i]; ++i)
block[i/Maxn+].push_back(str[i]);
maintain();
}
int main()
{
gets(str);
int pos;
],s[];
scanf("%d",&N);
init();
while(N--)
{
scanf("%s",p);
]=='I')
{
scanf("%s%d",s,&pos);
MyInsert(pos,s[]);
}
else
{
scanf("%d",&pos);
printf("%c\n",MyQuery(pos));
}
}
;
}
POJ 2887 Big String (块状数组)的更多相关文章
- Poj 2887 Big String(块状数组)
Big String Time Limit: 1000MS Memory Limit: 131072K Description You are given a string and supposed ...
- POJ 2887 Big String(块状链表)
题目大意 给一个字符串,长度不超过 106,有两种操作: 1. 在第 i 个字符的前面添加一个字符 ch 2. 查询第 k 个位置是什么字符 操作的总数不超过 2000 做法分析 好多不同的做法都可以 ...
- poj 2887 Big String
题目连接 http://poj.org/problem?id=2887 Big String Description You are given a string and supposed to do ...
- Big String 块状数组(或者说平方分割)
Big String 给一个字符串,长度不超过 106,有两种操作: 1. 在第 i 个字符的前面添加一个字符 ch 2. 查询第 k 个位置是什么字符 操作的总数不超过 2000 如果直接模拟的话, ...
- hdu 3553 Just a String (后缀数组)
hdu 3553 Just a String (后缀数组) 题意:很简单,问一个字符串的第k大的子串是谁. 解题思路:后缀数组.先预处理一遍,把能算的都算出来.将后缀按sa排序,假如我们知道答案在那个 ...
- codefroce D. Powerful array[初识块状数组]
codefroce D. Powerful array[初识块状数组] 由于是初始所以,仅仅能先用别人的分析.囧... 题目: 给定一个数列:A1, A2,--,An,定义Ks为区间(l,r)中s出现 ...
- 范围运算符和索引的最终运算符 ^ 在string 和数组中的应用
//范围运算符在string 和数组中的应用 static void Main(string[] args) { string examplestring = "123456789" ...
- POJ 2887:Big String(分块)
http://poj.org/problem?id=2887 题意:给出一个字符串,还有n个询问,第一种询问是给出一个位置p和字符c,要在位置p的前面插入c(如果p超过字符串长度,自动插在最后),第二 ...
- Big String(poj 2887)
题意: 给你一个不超过1e6的字符串,和不超过2000次的操作 操作分为两种: 1.将一个字符插入到某个位置的前面 2.询问当前位置的字符 /* 块状链表模板水题(我的智商也就能做这种题了). 观察题 ...
随机推荐
- ios app 支持 ipv6-only
最近苹果公司发布声明:自今年6月1日开始,所有提交至苹果App Store的应用申请必须要兼容面向硬件识别和网络路由的最新互联网协议--IPv6-only标准. 那么问题来了,目前的app是否支持ip ...
- C# System.Diagnostics.Stopwatch 类
测量一个时间间隔的运行时间 a.调用 Start 方法 b.调用 Stop 方法 c.使用 Elapsed 属性检查运行时间. 如: System.Diagnostics.Stopwatch stop ...
- Qt之属性系统
简述 Qt提供一个类似于其它编译器供应商提供的复杂属性系统(Property System).然而,作为一个编译器和平台无关的库,Qt不能够依赖于那些非标准的编译器特性,比如:__property或者 ...
- JavaWeb学习之环境搭建
1. HTML(Hyper Text Markup Language) , 超文本标记语言. HTML文件的后缀名一般是: .htm , .html 表单(form): 浏览器内核: WebKit , ...
- hdu-----2491Priest John's Busiest Day(2008 北京现场赛G)
Priest John's Busiest Day Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- 各种浏览器css hack
转载 http://www.cnblogs.com/jikey/archive/2010/06/21/1761924.html IE都能识别*,标准浏览器(如FF)不能识别*:IE6能识别*,但不能识 ...
- go局部变量的存储空间是堆还是栈?
编译器会自动选择在栈上还是在堆上分配局部变量的存储空间,但可能令人惊讶的是,这个选择并不是由用var还是new声明变量的方式决定的. var global *int func f() { var x ...
- vim多行注释和取消多行注释
多行注释: 1. 进入命令行模式,按ctrl + v进入 visual block模式(可视快模式),然后按j, 或者k选中多行,把需要注释的行标记起来 2. 按大写字母i,再插入注释符,例如// 3 ...
- mysql在一台服务器搭建主从1
1. 登录mysq的方法: mysql-S /tmp/mysql.sock 登录3306 mysql -S /tmp/mysql_slave.sock 登录3307 mysql -h 127.0. ...
- [示例]创建Student类,输入学生信息并存入字典,将3个存有学生信息的字典存入数组,并计算
代码: main: #import <Foundation/Foundation.h> #import "Student.h" int main(int argc, c ...