/*
第一次做有关fail树的题目。
fail树就是根据AC自动机上的fail指针建的树,树边由fail[i]指向i。
查询x在y中出现的次数就是在fail树中查询y的子树中x的节点出现的次数。
用树状数组维护一下。
*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define N 100010
using namespace std;
int l[N],r[N],t[N*2],n,m,cnt,T,size=1;
int head[N],headq[N],pos[N],ans[N];
int fa[N],a[N][26],point[N];
char ch[N];
queue<int> q;
struct node{
int v,pre;
};node e[N],eq[N];
void insert(int u,int v){
e[++cnt].v=v;e[cnt].pre=head[u];head[u]=cnt;
}
void add(int x,int v){
for(int i=x;i<=T;i+=i&-i) t[i]+=v;
}
int query(int x){
int sum=0;
for(int i=x;i;i-=i&-i) sum+=t[i];
return sum;
}
void trie(){
int now=1,id=0;
for(int i=0;i<n;i++)
if(ch[i]==‘P‘) pos[++id]=now;
else if(ch[i]==‘B‘) now=fa[now];
else {
int t=ch[i]-‘a‘;
if(!a[now][t]){
a[now][t]=++size;
fa[a[now][t]]=now;
}
now=a[now][t];
}
}
void build(){
q.push(1);point[1]=0;
while(!q.empty()){
int now=q.front();q.pop();
for(int i=0;i<26;i++){
if(!a[now][i]) continue;
int k=point[now];
while(!a[k][i]) k=point[k];
point[a[now][i]]=a[k][i];
q.push(a[now][i]);
}
}
}
void solve(){
int now=1,id=0;
add(l[1],1);
for(int i=0;i<n;i++)
if(ch[i]==‘P‘){
id++;
for(int x=headq[id];x;x=eq[x].pre){
int t=pos[eq[x].v];
ans[x]=query(r[t])-query(l[t]-1);
}
}
else if(ch[i]==‘B‘) add(l[now],-1),now=fa[now];
else now=a[now][ch[i]-‘a‘],add(l[now],1);
}
void dfs(int x){
l[x]=++T;
for(int i=head[x];i;i=e[i].pre)
dfs(e[i].v);
r[x]=++T;
}
int main(){
scanf("%s",ch);
n=strlen(ch);
for(int i=0;i<26;i++) a[0][i]=1;
trie();build();
for(int i=1;i<=size;i++)
insert(point[i],i);
scanf("%d",&m);
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
eq[i].v=x;
eq[i].pre=headq[y];
headq[y]=i;
}
dfs(0);
solve();
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}