关于关闭流同步
查看原帖
关于关闭流同步
765446
MichaelWong楼主2023/9/9 15:49

先贴代码

// Author: MichaelWong
// Code: C++14(GCC 9)
// Date: 2023/9/9
// File: P4008 [NOI2003] 文本编辑器.cpp
#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define pii std::pair<int,int>
#define fsp(x) std::fixed<<std::setprecision(x)
#define forE(u) for(int p=head[u],v=to[p];p;p=next[p],v=to[p])
const int N=5e6;
inline std::string readlen(int n) {
	std::string s=" "; char ch=getchar();
	for(int i=1;i<=n;++i) { while(ch<32||126<ch) ch=getchar(); s+=ch,ch=getchar(); }
	return s;
}
namespace Splay {
	int fa[N],ch[N][2],size[N],root,T=0;
	char val[N];
	
	inline void pushup(int p) { size[p]=size[ch[p][0]]+size[ch[p][1]]+1; }
	inline bool getson(int p) { return ch[fa[p]][1]==p; }
	inline void init(int p,int f=0,char x=0) { size[p]=1,ch[p][0]=ch[p][1]=0,fa[p]=f,val[p]=x; }
	inline void rotate(int p) {
		int f=fa[p],g=fa[f],r=getson(p);
		f^root&&(ch[g][getson(f)]=p);
		ch[f][r]=ch[p][r^1],ch[p][r^1]=f,fa[f]=p,fa[p]=g;
		ch[f][r]&&(fa[ch[f][r]]=f);
		pushup(f),pushup(p);
	}
	inline void splay(int p,const int to=0) {
		for(;fa[p]!=to;rotate(p)) if(fa[fa[p]]!=to) rotate(getson(fa[p])==getson(p)?fa[p]:p);
		!to&&(root=p);
	}
	
	inline int kth(int k) {
		int p=root;
		while(1) {
			if(k>size[ch[p][0]]+1) k-=size[ch[p][0]]+1,p=ch[p][1];
			else if(k>size[ch[p][0]]) return splay(p),p;
			else p=ch[p][0];
		}
	}
	inline void insert(int pos,char val) {
		if(!root) return init(root=++T,0,val);
		int u=pos,p=ch[u][1];
		if(!p) return init(p=++T,u,val),ch[u][1]=p,splay(p);
		while(p) u=p,p=ch[p][0];
		init(p=++T,u,val),ch[u][0]=p,splay(p);
	}
	inline int advance(int p,int k) { return splay(p),kth(size[ch[p][0]]+1+k); }
	inline void remove(int p,int k) {
		int q=advance(p,k+1);
		splay(p),splay(q,p);
		int pos=ch[q][0];
		ch[q][0]=0,ch[pos][0]=ch[pos][1]=fa[pos]=0,size[pos]=0;
		pushup(q),pushup(q);
	}
	inline void print(int p) {
		ch[p][0]&&(print(ch[p][0]),0);
		std::cout<<val[p];
		ch[p][1]&&(print(ch[p][1]),0);
	}
	inline void print(int p,int k) {
		int q=advance(p,k+1);
		splay(p),splay(q,p);
		print(ch[q][0]);
	}
	inline int prec(int p) { return advance(p,-1); }
	inline int succ(int p) { return advance(p,1); }
}
using namespace Splay;
struct editor {
	int cursor=1;
	editor() { insert(0,'#'),insert(1,'#'); }
	
	inline void Move(int k) { cursor=kth(k+1); }
	inline void Insert(int n,std::string s) { for(int i=n;i;--i) insert(cursor,s[i]); }
	inline void Delete(int n) { remove(cursor,n); }
	inline void Get(int n) { print(cursor,n),std::cout<<'\n'; }
	inline void Prev() { cursor=prec(cursor); }
	inline void Next() { cursor=succ(cursor); }
} e;
int t; 
std::string opt,s;
int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr); std::cout.tie(nullptr);
	std::cin>>t;
	for(int i=1,x;i<=t;++i) {
		std::cin>>opt;
		if(opt=="Move") std::cin>>x,e.Move(x);
		else if(opt=="Insert") std::cin>>x,s=readlen(x),e.Insert(x,s);
		else if(opt=="Delete") std::cin>>x,e.Delete(x);
		else if(opt=="Get") std::cin>>x,e.Get(x);
		else if(opt=="Prev") e.Prev();
		else if(opt=="Next") e.Next();
	}
	return 0;
}
// The code was submitted on Luogu.
// Version: 1.
// If I filled in nothing on the statement,
// it means I'm in a contest and I have no time to do this job.

尝试用 freopen 挂接文件,输出了一下读入的字符串,发现第一个测试点的字符串从

"q."X/m{>{1KF;$Vm_j[$9P<X@7yLIu3Jk>GENLS*P"rrmGLC`JK>0=|gOS7j^R-H{I0'W)jIW

变成了

"(C`)_^MW4lB-|G_b[r;pxLNl(N8,3Bhk@2Q*Jc>3Vbr1zT9GA57HBS!FhNzIn*82R?bGZ}fFm

把流同步两行代码注释掉就好了,有语言佬知道为什么流同步会导致这个问题吗?

2023/9/9 15:49
加载中...