多输出了几个空格,为什么啊
查看原帖
多输出了几个空格,为什么啊
482610
Mortidesperatslav楼主2024/4/12 21:38

发了三个帖子都没人理/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(); 
	}
}
2024/4/12 21:38
加载中...