萌新以此题入门块链,对着第一篇题解写的。
WA 60pts
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int __pool[2000000], __ptr;
int newnode() { return __pool[__ptr++]; }
void delnode(int x) { __pool[--__ptr] = x; }
const int M = 2100;
struct node {
int sz, nxt;
char str[M << 1];
} f[M << 2];
void init(int __n) {
for (int i = 1; i < __n; i++) __pool[i] = i;
__ptr = 1;
f[0].sz = 0; f[0].nxt = -1;
}
void append(int x, int y, int sz, char *s) {
if (-1 != y) {
f[y].nxt = f[x].nxt;
f[y].sz = sz;
memcpy(f[y].str, s, sz);
}
f[x].nxt = y;
}
void merge(int x, int y) {
memcpy(f[x].str + f[x].sz, f[y].str, f[y].sz);
f[x].sz += f[y].sz;
f[x].nxt = f[y].nxt;
delnode(y);
}
void split(int x, int p) {
if (x == -1 || p == f[x].sz) return;
append(x, newnode(), f[x].sz - p, f[x].str + p);
f[x].sz = p;
}
int locate(int &p) {
int x = 0;
while (-1 != x && p > f[x].sz) {
p -= f[x].sz;
x = f[x].nxt;
}
return x;
}
void insert(int p, int m, char *s) {
int x = locate(p), y, curlen = 0;
split(x, p);
int ori = x;
while (curlen + M <= m) {
append(x, y = newnode(), M, s + curlen);
curlen += M;
x = y;
}
if (m > curlen) append(x, y = newnode(), m - curlen, s + curlen);
if (-1 != y && f[x].sz + f[y].sz < M) merge(x, y), y = f[x].nxt;
if (-1 != f[ori].nxt && f[ori].sz + f[f[ori].nxt].sz < M) merge(ori, f[ori].nxt);
}
void erase(int p, int m) {
int x = locate(p);
split(x, p);
int y = f[x].nxt;
while (-1 != y && m > f[y].sz) {
m -= f[y].sz;
y = f[y].nxt;
}
split(y, m);
y = f[y].nxt;
for (int i = f[x].nxt; i != y; i = f[x].nxt) {
f[x].nxt = f[i].nxt;
delnode(i);
}
while (-1 != y && f[x].sz + f[y].sz < M) {
merge(x, y);
y = f[x].nxt;
}
}
void query(int p, int m) {
static char ans[20000000];
int x = locate(p);
int curlen = f[x].sz - p;
curlen = min(curlen, m);
memcpy(ans, f[x].str + p, curlen);
int w = f[x].nxt;
while (-1 != w && curlen + f[w].sz <= m) {
memcpy(ans + curlen, f[w].str, f[w].sz);
curlen += f[w].sz;
w = f[w].nxt;
}
if (-1 != w && m > curlen) memcpy(ans + curlen, f[w].str, m - curlen);
printf("%s\n", ans);
}
char qs[3000000];
char op[20];
int main() {
init(M << 1);
int curpos = 0;
int q; scanf("%d", &q);
while (q--) {
scanf("%s", op);
if (op[0] == 'M') scanf("%d", &curpos);
else if (op[0] == 'I') {
int t;
scanf("%d", &t);
for (int i=0;i<t;i++) {
qs[i] = getchar();
if (qs[i] < 32 || qs[i] > 128) i--;
}
insert(curpos, t, qs);
} else if (op[0] == 'D') {
int t;
scanf("%d", &t);
erase(curpos, t);
} else if (op[0] == 'G') {
int t;
scanf("%d", &t);
query(curpos, t);
} else if (op[0] == 'P') --curpos;
else if (op[0] == 'N') ++curpos;
}
}