发了三个帖子都没人理/oh
#include<bits/stdc++.h>
using namespace std;
const int sqn = 520;
int cnt, gb, qwq;
struct node{
public:
int nxt, siz;
string vl;
}lis[sqn << 4];
int nw(int qq){
++cnt;
lis[qq].nxt = cnt;
lis[cnt].siz = 0;
lis[cnt].vl = "";
lis[cnt].nxt = -1;
return cnt;
}
void mg(int u, int v){
// cout << "mg" << u << " " << v << "\n";
for (int i = 1; i <= lis[v].siz; i++)
lis[u].vl += lis[v].vl[i];
lis[u].nxt = lis[v].nxt;
lis[u].siz += lis[v].siz - 1;
lis[v].vl = "";
lis[v].siz = 0;
lis[v].nxt = -1;
// cout << lis[u].vl << " " << lis[v].vl << "\n";
}
void spt(int u, int k){
// cout << "spt" << u << " " << k << "\n";
int unx = lis[u].nxt;
int nid = nw(u);
string s1 = "", s2 = "";
for (int i = 1; i <= k; i++)
s1 += lis[u].vl[i];
for (int i = k + 1; i <= lis[u].siz; i++)
s2 += lis[u].vl[i];
// cout << s1 << "\n" << s2 << "\n";
lis[u].vl = (string)" " + s1;
lis[nid].vl = (string)" " + s2;
lis[u].siz = s1.size();
lis[nid].siz = s2.size();
lis[nid].nxt = unx;
// cout << unx << "\n";
// cout << "::" << u << " " << nid << "\n";
// cout << lis[u].vl << "****" << lis[nid].vl << "\n";
// cout << lis[u].nxt << " " << lis[nid].nxt << "\n";
}
string gst(int s_siz){
string res;
char ch;
for (int i = 1; i <= s_siz; i++){
ch = getchar();
if (ch == '\n' || ch == '\r'){
i--;
continue;
}
res += ch;
}
return res;
}
void ins(int u, string x){
if (cnt == 0){
int v = nw(0);
lis[v].vl = " " + x;
lis[v].siz = x.size();
}
int qz = 0, pre = 0;
for (int v = 0; v != -1; v = lis[v].nxt){
if (qz < u && qz + lis[v].siz >= u){
spt(v, u - qz);
lis[v].vl += x;
lis[v].siz += x.size();
// cout << lis[v].vl << "\n";
if (pre != 0 && lis[pre].siz < lis[lis[v].nxt].siz)
if (lis[v].siz + lis[pre].siz < sqn)
mg(pre, v);
else if (lis[v].nxt != -1)
if (lis[v].siz + lis[lis[v].nxt].siz < sqn)
mg(v, lis[v].nxt);
return;
}
qz += lis[v].siz;
pre = v;
}
}
void bdel(int u, int pre){
// cout << pre << " " << u << "\n";
lis[pre].nxt = lis[u].nxt;
lis[u].vl = "";
lis[u].siz = 0;
}
void del(int l, int r){
int qz = 0, pre = 0;
for (int v = 0; v != -1; v = lis[v].nxt){
int kr = qz + lis[v].siz;
if (kr < l){
pre = v;
qz += lis[v].siz;
continue;
}
if (qz > r)
break;
// cout << v << " " << kr << " " << lis[v].nxt << "\n";
// system("pause");
if (qz >= l && kr <= r)
bdel(v, pre);
else{
if (qz < l && kr > r){
spt(v, l - 1 - qz);
spt(lis[v].nxt, r - qz);
bdel(lis[v].nxt, v);
}else if (qz < l){
spt(v, l - 1 - qz);
bdel(lis[v].nxt, v);
}else{
spt(v, r - qz);
bdel(v, pre);
}
if (pre != 0 && lis[pre].siz < lis[lis[v].nxt].siz)
if (lis[v].siz + lis[pre].siz < sqn / 3 * 4)
mg(pre, v);
else if (lis[v].nxt != -1)
if (lis[v].siz + lis[lis[v].nxt].siz < sqn / 3 * 4)
mg(v, lis[v].nxt);
}
pre = v;
qz += lis[v].siz;
}
}
void get(int l, int r){
int qz = 0, pre = 0;
// cout << l << " " << r << "\n";
for (int v = 0; v != -1; v = lis[v].nxt){
// cout << v << " " << qz + 1 << " " << qz + lis[v].siz + 1 << "\n";
// cout << lis[v].vl << "\n";
int kr = qz + lis[v].siz + 1;
if (kr < l){
pre = v;
qz += lis[v].siz;
continue;
}
if (qz > r)
break;
if (qz >= l && kr <= r)
for (int i = 1; i <= lis[v].vl.size(); i++)
cout << lis[v].vl[i];
else{
if (qz < l && kr > r){
for (int i = l; i <= r; i++)
cout << lis[v].vl[i];
}else if (qz < l){
for (int i = l; i <= kr; i++)
cout << lis[v].vl[i];
}else if (kr > r){
for (int i = qz + 1; i <= r; i++)
cout << lis[v].vl[i];
}
}
pre = v;
qz += lis[v].siz;
}
}
void prtnow(){
for (int v = 0; v != -1; v = lis[v].nxt)
cout << lis[v].vl;
cout << "\n";
}
int main(){
// freopen("hack.in", "r", stdin);
// freopen("hack.out", "w", stdout);
cin >> qwq;
while (qwq--){
string op;
cin >> op;
if (op == "Insert"){
int lnt;
cin >> lnt;
ins(gb, gst(lnt));
}else if (op == "Delete"){
int x;
cin >> x;
del(gb + 1, gb + x);
}else if (op == "Get"){
int x;
cin >> x;
get(gb + 1, gb + x);
cout << "\n";
}else if (op == "Move"){
int x;
cin >> x;
gb = x;
// cout << gb << "\n";
}else if (op == "Prev")
gb--;
else if (op == "Next")
gb++;
// prtnow();
}
}