社区讨论
FHQ Treap,50pts求助
P4036[JSOI2008] 火星人参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo3as52t
- 此快照首次捕获于
- 2023/10/24 03:35 2 年前
- 此快照最后确认于
- 2023/10/24 03:35 2 年前
CPP
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int N=6e5+10;
int ch[N][2],siz[N],dat[N],tot=0,rt=0;
unsigned ll hx[N],mi[N];
char val[N];
int nw(char v){
val[++tot]=v;
siz[tot]=1; dat[tot]=rand();
hx[tot]=v-'a'+1;
return tot;
}
void pushup(int x){
if(x) siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1,hx[x]=hx[ch[x][0]]*(mi[siz[ch[x][1]]+1])+(val[x]-'a'+1)*mi[siz[ch[x][1]]]+hx[ch[x][1]];
}
void split(int p,int rk,int &x,int &y){
if(p==0) x=y=0;
else if(rk<=siz[ch[p][0]]) y=p,split(ch[p][0],rk,x,ch[p][0]);
else x=p,split(ch[p][1],rk-siz[ch[p][0]]-1,ch[p][1],y);
pushup(p);
}
int merge(int x,int y){
if(!x||!y) return x+y;
if(dat[x]<=dat[y]){
ch[x][1]=merge(ch[x][1],y);
return pushup(x),x;
}
else{
ch[y][0]=merge(x,ch[y][0]);
return pushup(y),y;
}
}
int main(){
srand(time(NULL));
mi[0]=1; for(int i=1;i<=6e5;i++) mi[i]=mi[i-1]*131;
string s; cin>>s;
for(char c:s) rt=merge(rt,nw(c));
int m; cin>>m;
while(m--){
char o; cin>>o;
if(o=='Q'){
int L,R; cin>>L>>R;
int l=1,r=siz[rt]-max(L,R)+1,res=0;
while(l<=r){
int mid=(l+r)/2;
int x,y,z;
unsigned h1,h2;
split(rt,L+mid-1,x,z);
split(x,L-1,x,y);
h1=hx[y];
rt=merge(merge(x,y),z);
split(rt,R+mid-1,x,z);
split(x,R-1,x,y);
h2=hx[y];
rt=merge(merge(x,y),z);
if(h1==h2) res=mid,l=mid+1;
else r=mid-1;
}
cout<<res<<"\n";
}
else if(o=='R'){
int p; char c; cin>>p>>c;
int x,y,z;
split(rt,p,x,z);
split(x,p-1,x,y);
val[y]=c;
rt=merge(merge(x,y),z);
}
else{
int p; char c; cin>>p>>c;
int x,y;
split(rt,p,x,y);
rt=merge(merge(x,nw(c)),y);
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...