记录编号 |
454251 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[JSOI 2008]火星人prefix |
最终得分 |
100 |
用户昵称 |
Anonymity |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.980 s |
提交时间 |
2017-09-28 18:37:44 |
内存使用 |
1.17 MiB |
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#define maxn 100005
using namespace std;
inline int read()
{ char c=getchar();int x=0,y=1;
while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*y;
}
inline char readchar(){char c;for(c=getchar();c<'a'||c>'z';c=getchar());return c;}
inline char readop(){char c;for(c=getchar();c!='Q'&&c!='R'&&c!='I';c=getchar());return c;}
template<typename T>
inline T m_min(T x,T y){return x<y?x:y;}
const int P=123;
typedef unsigned int ull;
char T[maxn];
int len,m;
ull H[maxn],xp[maxn];
struct Treap
{ Treap *ch[2];int s,r;ull Hash,v;
Treap(ull x=0):v(x),Hash(x),r(rand()),s(1){ch[0]=ch[1]=NULL;}
inline int sz(){return this?this->s:0;}
inline ull hv(){return this?this->Hash:0;}
inline void mt()
{ if(!this) return;
this->s=this->ch[0]->sz()+this->ch[1]->sz()+1;
this->Hash=this->ch[0]->hv()+this->v*xp[this->ch[0]->sz()]+this->ch[1]->hv()*xp[this->ch[0]->sz()+1];
}
inline void paint(ull x){if(this){this->v=this->Hash=x;}}
}*root;
typedef pair<Treap*,Treap*> dt;
inline Treap* merge(Treap* x,Treap* y)
{ if(!x) return y;if(!y) return x;
if(x->r < y->r){x->ch[1]=merge(x->ch[1],y);x->mt();return x;}
else{y->ch[0]=merge(x,y->ch[0]);y->mt();return y;}
}
inline dt split(Treap* x,int k)
{ if(!x) return dt(NULL,NULL);if(!k) return dt(NULL,x);
dt y;
if(x->ch[0]->sz()>=k) y=split(x->ch[0],k),x->ch[0]=y.second,x->mt(),y.second=x;
else y=split(x->ch[1],k-x->ch[0]->sz()-1),x->ch[1]=y.first,x->mt(),y.first=x;
return y;
}
inline Treap* build(char* s,int y)
{ Treap* *st=new Treap*[len];Treap *las,*x,*ans;int tail=0;
for(int i=1;i<=y;++i)
{ x=new Treap(s[i]-'a');las=NULL;
while(tail&&st[tail-1]->r > x->r)
st[tail-1]->mt(),las=st[tail-1],st[--tail]=NULL;
if(tail) st[tail-1]->ch[1]=x;
x->ch[0]=las;st[tail++]=x;
}
while(tail) st[--tail]->mt();
ans=st[0];
delete []st;
return ans;
}
inline ull getmes(int x,int y)
{ dt t1=split(root,y),t2=split(t1.first,x-1);
ull tmp=t2.second->hv();root=merge(merge(t2.first,t2.second),t1.second);
return tmp;
}
inline int query(int x,int y)
{ if(x==y) return len-x+1;
int rig=m_min(len-x+1,len-y+1),lef=0,mid,ans=0;
while(lef<=rig)
{ mid=lef+rig>>1;
if(getmes(x,x+mid-1)==getmes(y,y+mid-1)) ans=mid,lef=mid+1;
else rig=mid-1;
}
return ans;
}
inline void change(int x,ull y)
{ dt t1=split(root,x-1),t2=split(t1.second,1);
t2.first->paint(y);
root=merge(t1.first,merge(t2.first,t2.second));
}
inline void insert(int x,ull y)
{ Treap* tmp=new Treap(y);
dt t1=split(root,x);root=merge(merge(t1.first,tmp),t1.second);
}
int main()
{ freopen("bzoj_1014.in","r",stdin);
freopen("bzoj_1014.out","w",stdout);
scanf("%s",T+1);m=read();len=strlen(T+1);xp[0]=1;
for(int i=1;i<=100000;++i) xp[i]=xp[i-1]*P;
root=build(T,len);int x,y;char z;
for(int i=1;i<=m;++i)
{ z=readop();
if(z=='Q'){x=read();y=read();printf("%d\n",query(x,y));}
else if(z=='R'){x=read();z=readchar();change(x,z-'a');}
else{x=read();z=readchar();insert(x,z-'a');++len;}
}
return 0;
}