【POJ 2887】Big String 块状链表
2015-08-06 09:06
260 查看
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 1000004 #define len 2000 struct BK{ struct Node{ char c[len]; int size, ne; void init() { size = 0, ne = -1; } }node[len]; int head, tot; void init(char *s) { head = tot = 0; node[0].init(); int i, j, cur; for (i = 0, cur = head;s[i];cur = node[cur].ne) { for (j = 0;j < len && s[i];i++,j++) { node[cur].c[j] = s[i]; node[cur].size++; } if (s[i]) { node[cur].ne = ++tot; node[tot].init(); } } for (i = head;~i;i = node[i].ne) { if (node[i].size == len) spli(i); } } void spli(int id) { node[++tot].init(); for (int i = len/2, j = 0;i < len;i++,j++) { node[tot].c[j] = node[id].c[i]; node[id].size--, node[tot].size++; } node[tot].ne = node[id].ne; node[id].ne = tot; } char find(int p) { int cur = head; while (cur != -1 && node[cur].size < p) p-=node[cur].size, cur = node[cur].ne; return node[cur].c[p-1]; } void ins(int p, char s) { int cur = head; while (node[cur].ne != -1 && p > node[cur].size) p-=node[cur].size, cur = node[cur].ne; if (p >= node[cur].size) node[cur].c[node[cur].size] = s; else { for (int i = node[cur].size;i > p;i--) node[cur].c[i] = node[cur].c[i-1]; node[cur].c[p] = s; } node[cur].size++; if (node[cur].size == len) spli(cur); } }bk; char s ; int main() { int i, n; char op[2], c; while (~scanf("%s", s)) { bk.init(s); scanf("%d", &n); while (n--) { scanf("%s", op); if (op[0] == 'Q') { scanf("%d", &i); printf("%c\n", bk.find(i)); }else { scanf(" %c%d", &c, &i); bk.ins(i-1, c); } } } }
相关文章推荐
- 南邮 OJ 1534 D ? Recursively Palindromic Partitions
- Android 开源项目分类汇总
- fortran中//表示什么啊?双斜杠
- 手势识别器
- UI06_UIScrollview
- hd 1181 变形课
- 南邮 OJ 1533 C ? Binary Clock
- eclipse加载工程中出现红叹号
- day12
- git详细介绍
- UI06_ScrollviewLoop
- linux 批量查找替换文件中的某个字符串
- [autoLayout]自动布局下的纯storyboard添加约束--四个imageView平分一个屏幕的宽度
- Java利用Zxing生成二维码
- C++ 强制类型转换
- 南邮 OJ 1532 B ? Cryptoquote
- 20150806
- 翻转排序
- js实现多图片上传
- regsvr32注册模块c\program 加载失败