您的位置:首页 > 其它

【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);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: