rt,调了一晚上了
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+7,M=1e9+7,P=131;
mt19937_64 rd(time(0));
int pw[N],loc[N],pos[N],h[30],a[N],n,q,k;
char s[N],op[5];
struct Node{
int len,hs;
};
Node operator+ (Node x,Node y){
return {x.len+y.len,(x.hs*pw[y.len]%M+y.hs)%M};
}
struct SegmentTree{
#define ls u*2
#define rs u*2+1
#define lson ls,l,mid
#define rson rs,mid+1,r
Node tr[N<<2];
void pushup(int u){
tr[u]=tr[ls]+tr[rs];
}
void update(int u,int l,int r,int x,int k){
if (l==r){
tr[u]={1,h[k]};
return ;
}
int mid=l+r>>1;
if (x<=mid) update(lson,x,k);
else update(rson,x,k);
pushup(u);
}
Node query(int u,int l,int r,int ql,int qr){
if (l>=ql && r<=qr) return tr[u];
if (l>qr || r<ql || ql>qr) return {0,0};
int mid=l+r>>1;
return query(lson,ql,qr)+query(rson,ql,qr);
}
} seg;
struct BIT{
int tr[N];
void add(int x,int y){
if (x==0) x=1;
while (x<=k) tr[x]+=y,x+=x&(-x);
}
int ask(int x){
int ans=0;
while (x) ans+=tr[x],x&=x-1;
return ans;
}
int calc(int x){
int l=x,r=k,ans;
while (l<=r){
int mid=l+r>>1;
if (ask(mid)>=x) r=mid-1,ans=mid;
else l=mid+1;
}
return ans+1;
}
} bit;
struct Query{
int op,x,y;
} qry[N];
signed main(){
for (int i=0;i<26;++i)
h[i]=rd()%M;
scanf("%s%lld",s+1,&q),n=k=strlen(s+1);
for (int i=1;i<=n;++i)
pos[i]=i-1;
for (int i=1,x,y;i<=q;++i){
scanf("%s%lld",op,&qry[i].x);
if (op[0]=='Q') qry[i].op=0,scanf("%d",&qry[i].y);
else if (op[0]=='R') qry[i].op=1,scanf("%s",op),qry[i].y=op[0]-'a';
else qry[i].op=2,scanf("%s",op),qry[i].y=op[0]-'a',pos[loc[i]=++k]=qry[i].x;
}
pw[0]=1;
for (int i=1;i<=k;++i)
pw[i]=pw[i-1]*P%M,bit.add(i,1);
for (int i=k;i;--i)
a[i]=bit.calc(pos[i]),bit.add(a[i],-1);
for (int i=1;i<=n;++i)
seg.update(1,1,k,a[i],s[i]-'a'),bit.add(a[i],1);
for (int i=1;i<=q;++i){
if (qry[i].op==0){
int x=bit.calc(qry[i].x-1),y=bit.calc(qry[i].y-1);
int l=1,r=n-max(qry[i].x,qry[i].y)+1,ans=0;
while (l<=r){
int mid=l+r>>1;
if (seg.query(1,1,k,x,bit.calc(qry[i].x+mid-2)).hs==
seg.query(1,1,k,y,bit.calc(qry[i].y+mid-2)).hs) ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",ans);
}
else if (qry[i].op==1) seg.update(1,1,k,bit.calc(qry[i].x-1),qry[i].y);
else seg.update(1,1,k,a[loc[i]],qry[i].y),bit.add(a[loc[i]],1),++n;
}
return 0;
}