#include<bits/stdc++.h>
#define LL unsigned long long
#define ls(x) t[x].l
#define rs(x) t[x].r
const LL N=1e6+5;
const LL P=29;
using namespace std;
struct node
{
LL l,r,sz;
LL hsh,val;
LL pri;
}t[N];
LL n,rt,tot,a[N];
LL Pw[N];
LL Make(LL x)
{
t[++tot]={0ll,0ll,1ll,x,x,(LL)(rand())};
return tot;
}
void Up(LL x)
{
t[x].sz=t[ls(x)].sz+t[rs(x)].sz+1;
t[x].hsh=(t[ls(x)].hsh*Pw[t[rs(x)].sz+1]+t[x].val*Pw[t[rs(x)].sz]+t[rs(x)].hsh);
}
void Mrg(LL &rt,LL x,LL y)
{
if(!x||!y)rt=x+y;
else
{
if(t[x].pri<t[y].pri)rt=x,Mrg(rs(x),rs(x),y);
else rt=y,Mrg(ls(y),x,ls(y));
Up(rt);
}
}
void Spl(LL rt,LL &x,LL &y,LL v)
{
if(!rt)x=y=0;
else
{
if(t[ls(rt)].sz<v)x=rt,Spl(rs(x),rs(x),y,v-t[ls(rt)].sz-1);
else y=rt,Spl(ls(y),x,ls(y),v);
Up(rt);
}
}
LL Hsh(LL x,LL y)
{
LL rt1=0,rt2=0,rt3=0;
Spl(rt,rt1,rt3,y),Spl(rt1,rt1,rt2,x-1);
LL hsh=t[rt2].hsh;
Mrg(rt1,rt1,rt2),Mrg(rt,rt1,rt3);
return hsh;
}
LL m;
char c[N];
bool pd(LL x,LL s,LL e)
{
LL Lhsh=Hsh(s,s+x-1),Rhsh=Hsh(e,e+x-1);
return Lhsh==Rhsh;
}
char op[35],s[35];
int main()
{
freopen("in","r",stdin);
freopen("out","w",stdout);
srand(time(0));
scanf("%s%llu",c+1,&m);
n=strlen(c+1);
Pw[0]=1;
for(LL i=1;i<=N-1;i++)Pw[i]=Pw[i-1]*P;
for(LL i=1;i<=n;i++)Mrg(rt,rt,Make(c[i]-'a'));
while(m--)
{
scanf("%s",op);
if(op[0]=='Q')
{
LL x,y;
scanf("%llu%llu",&x,&y);
if(x<y)swap(x,y);
LL l=1,r=min(t[rt].sz-x+1,t[rt].sz-y+1),ans=0;
while(l<=r)
{
LL mid=(l+r)/2;
if(pd(mid,x,y))ans=mid,l=mid+1;
else r=mid-1;
}
printf("%llu\n",ans);
}
else
{
LL x;
scanf("%llu",&x);
scanf("%s",s);
LL rt1=0,rt2=0,rt3=0;
Spl(rt,rt1,rt3,x),Spl(rt1,rt1,rt2,x-1);
assert(t[rt2].sz==1);
Mrg(rt1,rt1,Make(s[0]-'a'));
if(op[0]=='I')Mrg(rt1,rt1,rt2);
Mrg(rt,rt1,rt3);
}
}
}