块状链表50pts MLE+WA求调
查看原帖
块状链表50pts MLE+WA求调
677089
MichealDantes楼主2025/8/8 16:01
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int m = 2e3;
struct block
{
	int n;
	block *pre , *nex;
	char c[2005];
	block()
	{
		n = 0;
		pre = nex = nullptr;
		memset(c , 0 , sizeof(c));
	}
} bl[10005];
int cnt = 1;
block *cur = &bl[1] , *head = cur;
int k = 0;
void link(block *x , block *y)
{
	x -> nex = y;
	y -> pre = x;
}
block* create(block *x)
{
	block *t = &bl[++ cnt];
	t -> nex = x -> nex;
	link(x , t);
	return t;
}
void split(block *x , int p)
{
	block *t = create(x);
	copy(x -> c + p + 1 , x -> c + x -> n + 1 , t -> c + 1);
	t -> n = x -> n - p;
	x -> n = p;
}
void move()
{
	int x; scanf("%d" , &x);
	if (!head -> n) return;
	cur = head; k = 0;
	int sum = 0;
	while (cur -> nex != nullptr && sum + cur -> n <= x)
	{
		sum += cur -> n;
		cur = cur -> nex;
	}
	k = x - sum;
}
void insert()
{
	int n; scanf("%d" , &n);
	split(cur , k);
	block *t = cur;
	while (n --)
	{
		char x = getchar();
		while (x < 32 || x > 126) x = getchar();
		if (t -> n == m) t = create(t);
		t -> c[++ t -> n] = x;
	}
}
void del()
{
	int x; scanf("%d" , &x);
	split(cur , k);
	block *t = cur -> nex;
	int sum = 0;
	while (t != nullptr && sum + t -> n <= x)
	{
		sum += t -> n;
		t = t -> nex;
	}
	if (t == nullptr)
	{
		cur -> nex = nullptr;
		return;
	}
	if (sum < x) split(t , x - sum);
	if (!cur -> n && cur -> pre != nullptr) cur = cur -> pre;
	link(cur , t -> nex);
}
void get()
{
	int x; scanf("%d" , &x);
	if (k + x <= cur -> n)
	{
		for (int i = k + 1; i <= k + x; i++) printf("%c" , cur -> c[i]);
		printf("\n");
		return;
	}
	for (int i = k + 1; i <= cur -> n; i++) printf("%c" , cur -> c[i]);
	block *t = cur -> nex;
	int sum = cur -> n - k;
	while (t != nullptr && sum + t -> n <= x)
	{
		for (int i = 1; i <= t -> n; i++) printf("%c" , t -> c[i]);
		sum += t -> n;
		t = t -> nex;
	}
	if (t != nullptr)
		for (int i = 1; i <= x - sum; i++) printf("%c" , t -> c[i]);
	printf("\n");
}
void backward()
{
	if (k)
	{
		k --;
		return;
	}
	do
	{
		cur = cur -> pre;
		k = cur -> n - 1;
	} while (cur -> pre != nullptr && !cur -> n);
}
void forward()
{
	if (k < cur -> n)
	{
		k ++;
		return;
	}
	do
	{
		cur = cur -> nex;
		k = 1;
	} while (cur -> nex != nullptr && !cur -> n);
}
int main()
{
	int t; scanf("%d" , &t);
	while (t --)
	{
		string op; cin >> op;
		if (op[0] == 'M') move();
		else if (op[0] == 'I') insert();
		else if (op[0] == 'D') del();
		else if (op[0] == 'G') get();
		else if (op[0] == 'P') backward();
		else if (op[0] == 'N') forward();
	}
	return 0;
}
2025/8/8 16:01
加载中...