bzoj1507:[NOI2003]Editor
块状链表模板题
然而我de了一整天bug,难受
rmemcpy常数小,大数据相比for大概有0.5s左右的差别
答案绝对不要一个一个地printf啊!t到死啊! memcpy存下来然后puts,直接从4.8s到0.9s啊啊 哭
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<queue>
#include<ctime>
#include<cmath>
const int N=5000;
const int M=20000;
typedef long long LL;
using namespace std;
char p[N+7][M+7],o[N+7],s[N*N+7];
int T,xx;
template<typename T> void read(T &x) {
char ch=getchar(); x=0; T f=1;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=-1,ch=getchar();
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}
int now,head,sz[N],nx[N];
queue<int>que;
void del(int x) {sz[x]=nx[x]=0; que.push(x); }
int ins() {int x=que.front(); que.pop(); return x;}
int find(int &p) {
for(int i=head;i;i=nx[i]) {
if(p<=sz[i]) return i;
p-=sz[i];
}
}
void split(int x,int k) {
if(sz[x]<=k) return;
int y=ins();
for(int i=k+1;i<=sz[x];i++) p[y][++sz[y]]=p[x][i];
sz[x]=k; nx[y]=nx[x]; nx[x]=y;
}
void merge(int x) {
int i;
for(i=nx[x];i&&sz[x]+sz[i]<=M;) {
for(int j=1;j<=sz[i];j++) p[x][++sz[x]]=p[i][j];
int tp=i; i=nx[i]; del(tp);
} nx[x]=i;
}
void insert(int len) {
int k=now,t=0;
if(!head) head=ins();
int tp,x=find(k);
split(x,k); tp=x;
while(t<len) {
int y=ins();
for(int i=1;i<=M&&t<len;i++) p[y][++sz[y]]=s[++t];
nx[y]=nx[x];
nx[x]=y; x=y;
}
merge(tp); merge(x);
}
void erase(int len) {
int k=now,t=0;
int x=find(k);
split(x,k);
int i=nx[x];
while(t<len) {
if(t+sz[i]<=len) {
int tp=i;
t+=sz[i];
i=nx[i];
del(tp);
}
if(t+sz[i]>len) {
if(t==len) {nx[x]=i; break;}
split(i,len-t);
nx[x]=nx[i]; del(i); break;
}
}
merge(x);
}
char ans[N*N+7];
void print(int len) {
int k=now,t=0;
int x=find(k);
int le=min(len,sz[x]-k);
memcpy(ans,p[x]+k+1,le); t+=le;
for(x=nx[x];t<len;x=nx[x]) {
le=min(len-t,sz[x]);
memcpy(ans+t,p[x]+1,le);
t+=le;
} ans[len]=0;
puts(ans);
}
int main() {
read(T);
for(int i=1;i<=5000;i++) que.push(i);
while(T--) {
if(T==2654) {
int debug=1;
}
scanf("%s",o);
if(o[0]!='P'&&o[0]!='N') read(xx);
if(o[0]=='I') {
for(int i=1;i<=xx;i++) {
char ch=getchar();
while(ch<32||ch>126) ch=getchar();
s[i]=ch;
}
insert(xx);
}
else if(o[0]=='D') erase(xx);
else if(o[0]=='G') print(xx);
else if(o[0]=='M') now=xx;
else if(o[0]=='P') now--;
else if(o[0]=='N') now++;
}
return 0;
}