先贴代码
// 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
把流同步两行代码注释掉就好了,有语言佬知道为什么流同步会导致这个问题吗?