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.询问当前位置的字符 /* 块状链表模板水题(我的智商也就能做这种题了). 观察题 ...
随机推荐
- JQUERY学习(贰)
一.操作一组jQuery对象 1.遍历 $("").each(fun); 2.求长度:length size() 3.获得某一个jQuery对象 $("") ...
- Technical notes fornight
1.8.2016 Royal trumpeters heralded the beginning of the annual ceremony, as Norway's royal family an ...
- poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 43507 Accepted: 12693 ...
- Sum Root to Leaf Numbers [LeetCode]
Problem description: http://oj.leetcode.com/problems/sum-root-to-leaf-numbers/ Basic idea: To store ...
- MVC之URL路由
注册路由规则集合 一个 Web 应用具有一个全局的路由表,该路由表通过 System. Web.Routing.RouteTable的静态只读属性 Routes 表示,该属性返回一个类型为 Syste ...
- Oracle函数大全之转换函数
chartorowid(c1) [功能]转换varchar2类型为rowid值 [参数]c1,字符串,长度为18的字符串,字符串必须符合rowid格式 [返回]返回rowid值 [示例] SELECT ...
- lucene底层数据结构——底层filter bitset原理,时间序列数据压缩将同一时间数据压缩为一行
如何联合索引查询? 所以给定查询过滤条件 age=18 的过程就是先从term index找到18在term dictionary的大概位置,然后再从term dictionary里精确地找到18这个 ...
- linux shell中,单引号、 双引号,反引号(``),$()的区别
一.单引号和双引号 首先,单引号和双引号,都是为了解决中间有空格的问题. 空格在linux中时作为一个很典型的分隔符,比如 string1=this is a string,这样执行会报错.为了避免这 ...
- BZOJ3999 [TJOI2015]旅游
题面:给定一个有$n$个节点的树,每个点又点权$v_i$,每次选取一条树链$[a, b]$,求出$max(v_i - v_j)$,其中$i, j \in [a, b]$且$i$出现在$j$前面,最后树 ...
- 使用PL/SQL连接远程的Oracle数据库
PL/SQL不仅可以连接本机的oracle数据库.也可以连接远程的数据库. 需要修改一个文件:在本机oracle 数据库的安装目录下找到这个文件: /oracle/ora92/network/admi ...