萌新刚学块链,求助
查看原帖
萌新刚学块链,求助
551375
junxis楼主2022/12/19 12:51

萌新以此题入门块链,对着第一篇题解写的。

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;
	}
	
}
2022/12/19 12:51
加载中...