#include<cstdio>
#include<cctype>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
inline int read()
{
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
return x*f;
}
void print(int x)
{
if(!x) {putchar(‘0‘);putchar(‘\n‘);return;}
int len=0,buf[15];
while(x) buf[++len]=x%10,x/=10;
for(int i=len;i;i--) putchar(buf[i]+‘0‘);
putchar(‘\n‘);
}
const int maxn=200010;
int ch[maxn][26],fa[maxn],f[maxn],pos[maxn],id,sz;
void insert(char* s)
{
int j=0,c;
for(int i=0;s[i];i++)
{
c=s[i]-‘a‘;
if(s[i]==‘P‘) pos[++id]=j;
else if(s[i]==‘B‘) j=fa[j];
else
{
if(!ch[j][c]) ch[j][c]=++sz,fa[sz]=j;
j=ch[j][c];
}
}
}
queue<int> q;
void getfail()
{
for(int c=0;c<26;c++) if(ch[0][c]) q.push(ch[0][c]);
while(!q.empty())
{
int u=q.front(),v;q.pop();
for(int c=0;c<26;c++) if(v=ch[u][c])
{
q.push(v);int j=f[u];
while(j&&!ch[j][c]) j=f[j];
f[v]=ch[j][c];
}
}
}
int first[maxn],next[maxn],to[maxn],e;
void AddEdge(int u,int v){to[++e]=v;next[e]=first[u];first[u]=e;}
int l[maxn],r[maxn],cnt;
void dfs(int x)
{
l[x]=++cnt;
for(int i=first[x];i;i=next[i]) dfs(to[i]);
r[x]=++cnt;
}
int sumv[maxn];
void add(int x,int v) {for(;x<=cnt;x+=x&-x) sumv[x]+=v;}
int sum(int x) {int ret=0;for(;x;x-=x&-x) ret+=sumv[x];return ret;}
struct Query {int next,v;}Q[maxn];
int firstq[maxn],ans[maxn];
void solve(char* s)
{
int j=0,c;add(l[j],1);id=0;
for(int i=0;s[i];i++)
{
c=s[i]-‘a‘;
if(s[i]==‘P‘)
{
id++;for(int x=firstq[id];x;x=Q[x].next)
{
int v=pos[Q[x].v];
ans[x]=sum(r[v])-sum(l[v]-1);
}
}
else if(s[i]==‘B‘) add(l[j],-1),j=fa[j];
else j=ch[j][c],add(l[j],1);
}
}
char s[maxn];
int main()
{
scanf("%s",s);insert(s);getfail();
for(int i=1;i<=sz;i++) AddEdge(f[i],i);
dfs(0);
int m=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
Q[i].v=x;Q[i].next=firstq[y];firstq[y]=i;
}
solve(s);
for(int i=1;i<=m;i++) print(ans[i]);
return 0;
}