Big String 块状数组(或者说平方分割)
给一个字符串,长度不超过 106,有两种操作:
1. 在第 i 个字符的前面添加一个字符 ch
2. 查询第 k 个位置是什么字符
操作的总数不超过 2000
如果直接模拟的话,移动到后面的数据量太大。我们分块的话,就可以优化,减少移动的量。 很典型的块状数组。块状数组的next指向的是一块,而不是一个。这里用整数代替了指针。
每一个块就是一个对象。这题用面向对象编程。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long LL;
const int INF=0x4fffffff;
const int EXP=1e-;
const int MS=; struct node
{
int size,next;
char str[MS];
void push(char ch)
{
str[size++]=ch;
}
void insert(int pos,char ch)
{
for(int i=size++;i>pos;i--)
str[i]=str[i-];
str[pos]=ch;
} }nodes[MS]; char S[*MS];
int SIZE,cnt,Q; void input()
{
scanf("%s",S);
scanf("%d",&Q);
int len=strlen(S);
SIZE=(int)sqrt(0.1+len+Q);
cnt=;
nodes[cnt].size=;
for(int i=;i<len;i++)
{
if(nodes[cnt].size>=SIZE)
{
nodes[cnt].next=cnt+;
nodes[++cnt].size=;
}
nodes[cnt].push(S[i]);
}
nodes[cnt].next=-;
} //设一个块的最大容量为2*SIZE,当满了就要从后面使用一块来补充
void updata(int id)
{
if(nodes[id].size<*SIZE) // 我们是在区间插入一个字符后在更新,所以要留一个位置
return ;
++cnt;
int i,j,k=nodes[id].size;
for(i=SIZE,j=;i<k;i++,j++)
nodes[cnt].str[j]=nodes[id].str[i];
nodes[cnt].size=j;
nodes[id].size=SIZE;
nodes[cnt].next=nodes[id].next;
nodes[id].next=cnt;
} void solve()
{
int i,j,pos;
char cmd[MS];
for(i=;i<Q;i++)
{
scanf("%s",cmd);
if(cmd[]=='Q')
{
scanf("%d",&pos);
for(j=;pos>nodes[j].size;j=nodes[j].next)
pos-=nodes[j].size;
printf("%c\n",nodes[j].str[pos-]);
}
else
{
scanf("%s%d",cmd,&pos);
for(j=;pos>nodes[j].size&&nodes[j].next!=-;j=nodes[j].next)
pos-=nodes[j].size;
nodes[j].insert(min(pos-,nodes[j].size),cmd[]);
updata(j);
}
}
} int main()
{
input();
solve();
return ;
}
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 (块状数组)
题意:给一个字符串(<=1000000)和n个操作(<2000),每个操作可以在某个位置插入一个字符,或者查询该位置的字符.问查询结果. 思路:块状数组. 如果将原来的字符串都存在一起,每 ...
- ZOJ2112 Dynamic Rankings 动态区间第K最值 平方分割
有了上一题的经验(POJ的静态区间第K最值)再解决这道题就轻松多了 空间5256KB,时间3330ms,如果把动态开点的平衡树换成数组模拟的话应该会更快 之所以选择了平方分割而不是树套树,不仅是所谓趁 ...
- POJ2104 K-th Number 静态区间第k最值 平方分割
干掉这道题的那一刻,我只想说:我终于**的AC了!!! 最终内存1344K,耗时10282ms,比起归并树.划分树以及其他各种黑科技,这个成绩并不算光彩⊙﹏⊙ 但至少,从最初的无数次TLE到最终的AC ...
- 平方分割poj2104K-th Number
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 59798 Accepted: 20879 Ca ...
- 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出现 ...
- 有序数组每个数平方后,不同数字的个数?O(n)
此乃一道笔试题,当时的确也做出来啦.(但是在细节上还是出错啦,对多次重复出现的数字可能会重复计数,没有记录上次删除的元素) 如题,有序数组,可以知道平方之后在两边的数据较大,中间的数据较小. 因此可以 ...
- POJ2104 (平方分割)二分查找理解。
题意:任意区间求第k大数 思路: 预处理:利用平方分割(分桶法)把区间切割成B = sqrt(n)大小的一块块,然后每个各自排序. 二分第k大数x,接着就需要求[l,r]区间中x的排名,与k比较,将两 ...
随机推荐
- HTML5每日一练之OL列表的改良
在HTML5中的OL被改良了,为它增加了两个新属性. start属性:start属性用来定义列表编号的起始位置,比如下面的代码,列表将从50开始51...55以此类推 <ol start=&qu ...
- 关于Windows Azure 地缘组(Affinity Groups)
最近在和一些客户和朋友的沟通中,发现Windows Azure地缘组概念很少有了解.我的建议是使用地缘组来优化同一区域内的网络访问速度.如果我的说法有误,欢迎大家指正. 关于“地缘组”的概念(摘自MS ...
- How Tomcat Works(十八)
在前面的文章中,如果我们要启动tomcat容器,我们需要使用Bootstrap类来实例化连接器.servlet容器.Wrapper实例和其他组件,然后调用各个对象的set方法将它们关联起来:这种配置应 ...
- uva 542 - France '98(概率)
题目链接:uva 542 - France '98 题目大意:有16支球队比赛,给出16支球队的名称,然后给出16*16的表格,g[i][j] 表示i队胜j队的概率,问说16支球队获得总冠军的概率. ...
- Win7 x64下进程保护与文件保护(ObRegisterCallbacks)
进程保护部分参考 http://bbs.pediy.com/showthread.php?t=168023 进程保护,在任务管理器不能结束进程 #ifndef CXX_PROTECTPROCESSX6 ...
- Hibernate操作和保存方式
Session API [Java Hibernate 之 CRUD 操作]http://www.codeceo.com/article/java-hibernate-crud.html [Ses ...
- [读书笔记]SQL约束
目的:通过在列级或表级设置约束,确保数据符合某种数据完整性规则 实现:数据库主动地检查维护数据的完整性 手段:约束,数据类型,触发器 --------------------------------- ...
- 你真的会玩SQL吗?实用函数方汇总
http://www.cnblogs.com/zhangs1986/p/4917800.html 实用函数方法 由于有些知识很少被用到,但真需要用时却忘记了又焦头烂额的到处找. 现在将这些‘冷门“却有 ...
- js获取当前页面的url信息方法
例如网址:http://localhost:12085/My/OrderM.aspx 设置或获取对象指定的文件名或路径. alert(window.location.pathname) 输出结果:/M ...
- Flume-NG + HDFS + HIVE 日志收集分析
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...