http://poj.org/problem?id=2887

题意:给出一个字符串,还有n个询问,第一种询问是给出一个位置p和字符c,要在位置p的前面插入c(如果p超过字符串长度,自动插在最后),第二种询问是给出一个位置p,查找第p个位置的字符(p保证合法)。

思路:暴力分块。一开始建成块之后,每次插入就在每个块的字符串插入字符,因为询问最多只有2000个,所以就算极端情况也不会超时。

注意:sz和cnt其中一个要向上取整。用string类会超时。

 #include <cstring>
#include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
using namespace std;
char s[][];
char str[];
int n, block[], sz, cnt; void Build() {
sz = sqrt(n);
cnt = (n + sz - ) / sz; // 记得向上取整, 因为这WA了一次
for(int i = ; i < n; i++) s[i / sz + ][block[i / sz + ]++] = str[i];
} void Insert(char c, int p) {
int i;
for(i = ; i <= cnt; i++) {
if(p - block[i] <= ) break;
p -= block[i];
}
if(i == cnt + ) { s[cnt][block[cnt]++] = c; return ; }
block[i]++;
int len = strlen(s[i]);
for(int j = len - ; j >= p - ; j--) s[i][j+] = s[i][j];
s[i][p-] = c;
} void Query(int p) {
int i;
for(i = ; i <= cnt; i++) {
if(p - block[i] <= ) break;
p -= block[i];
}
printf("%c\n", s[i][p-]);
} int main() {
scanf("%s", str); n = strlen(str);
int q; scanf("%d", &q);
Build();
while(q--) {
char op[], c[]; int num;
scanf("%s", op);
if(op[] == 'I') {
scanf("%s%d", c, &num);
Insert(c[], num);
} else {
scanf("%d", &num);
Query(num);
}
}
return ;
}

POJ 2887:Big String(分块)的更多相关文章

  1. POJ 2887 Big String(块状链表)

    题目大意 给一个字符串,长度不超过 106,有两种操作: 1. 在第 i 个字符的前面添加一个字符 ch 2. 查询第 k 个位置是什么字符 操作的总数不超过 2000 做法分析 好多不同的做法都可以 ...

  2. poj 2887 Big String

    题目连接 http://poj.org/problem?id=2887 Big String Description You are given a string and supposed to do ...

  3. Poj 2887 Big String(块状数组)

    Big String Time Limit: 1000MS Memory Limit: 131072K Description You are given a string and supposed ...

  4. POJ 2887 Big String (块状数组)

    题意:给一个字符串(<=1000000)和n个操作(<2000),每个操作可以在某个位置插入一个字符,或者查询该位置的字符.问查询结果. 思路:块状数组. 如果将原来的字符串都存在一起,每 ...

  5. Big String(poj 2887)

    题意: 给你一个不超过1e6的字符串,和不超过2000次的操作 操作分为两种: 1.将一个字符插入到某个位置的前面 2.询问当前位置的字符 /* 块状链表模板水题(我的智商也就能做这种题了). 观察题 ...

  6. 2887 Big String

    splay瞎搞一下,正解是分块数组或分块链表,但是学不会啊! #include<cstdio> #include<cstdlib> #include<iostream&g ...

  7. POJ 2887

    #include <iostream> #include <string> #define MAXN 2000 using namespace std; struct node ...

  8. 好题 线段树对数据的保存+离线的逆向插入 POJ 2887

    题目大意:给一个字符串,有插入和询问操作,每次往一个位置插入一个字符或者询问第p个位置的字符是什么. 思路:我们离线询问,逆向把所有的字符都插入给线段树,然后再查询就好了,每次都要记得插入线段树的最后 ...

  9. POJ 2406 Power String

    算出next数组. 对于任何一个循环字串,len-next[len]必为最小循环节长度 若len%(len-next[len])==0 即为循环字串,n=len/(len-next[len]) 否则输 ...

随机推荐

  1. libuv和libev 异步I/O库的比较

    libuv 和 libev ,两个名字相当相近的 I/O Library,最近有幸用两个 Library 都写了一些东西,下面就来说一说我本人对两者共同与不同点的主观表述. 高性能网络编程这个话题已经 ...

  2. Easyui Tab刷新

    Easyui Tab刷新: function refreshTab(title){ var tab = $('#id').tab('getTab',title); $('#id').tab('upda ...

  3. jquery腾讯微博

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. wpf 事件参数 绑定到viewmdoel

    public sealed class EventCommand : TriggerAction<DependencyObject> { public static readonly De ...

  5. TThreadList Demo

    type TForm1 = class(TForm) Button1: TButton; Button3: TButton; ListBox1: TListBox; Button2: TButton; ...

  6. Kinect 开发驱动配置

    有几种配置方案 1.openNI+SensorKinect+PCL 的开发环境(pcl 标配) http://blog.csdn.net/chenxin_130/article/details/669 ...

  7. Wpf ImageSource对象与Bitmap对象的互相转换

    原文:Wpf ImageSource对象与Bitmap对象的互相转换 Bitmap to ImageSource 将得到的Bitmap对象转换为wpf常用的Imagesource对象 BitmapSo ...

  8. 设置代理调用WMTS服务

    一.数据准备 1.链接:http://pan.baidu.com/s/1sjzCytR 密码:uugc,下载DotNet版本 2. 发布切片服务,打开ogc服务可产看到相应的符合ogc标准的服务,如下 ...

  9. 了解Activity

    Android中的activity全都归属于task管理 .task 是多个 activity 的集合,这些 activity 按照启动顺序排队存入一个栈(即“back stack”).android ...

  10. nginx 配置https并自签名证书

    2016-10-28 转载请注明出处:http://daodaoliang.com/ 作者: daodaoliang 版本: V1.0.1 邮箱: daodaoliang@yeah.net 参考链接: ...