社区讨论

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 条回复,欢迎继续交流。

正在加载回复...