rt
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define int long long
using namespace std;
void read(int &x){
x=0;
char c=getchar();
while(!('0'<=c && c<='9')){
c=getchar();
}
while('0'<=c && c<='9'){
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
}
struct Edge{
int to,nxt;
Edge(){}
Edge(int t,int nx){
to=t;
nxt=nx;
}
} e[400010];
int hs[200010],tot=-1;
void add(int u,int v){
e[++tot]=Edge(v,hs[u]);
hs[u]=tot;
}
int sgt[800010],res[200010];
struct Query{
int u,id;
Query(){}
Query(int uu,int i){
u=uu;
id=i;
}
};
vector<Query> qs[200010];
int tr[200010][26],nxt[200010],trie[200010][26],cnt=0,pos[200010],dfn[200010],dfc=0,en[200010];
int siz[200010];
void insert(char *s,int id){
int cur=0;
for(int i=0;s[i];i++){
s[i]-='a';
if(!tr[cur][s[i]]){
tr[cur][s[i]]=++cnt;
}
cur=tr[cur][s[i]];
s[i]+='a';
}
pos[cur]=id;
en[id]=cur;
}
void build(){
queue<int> q;
memcpy(trie,tr,sizeof(tr));
for(int i=0;i<26;i++){
if(tr[0][i]){
q.push(tr[0][i]);
}
}
while(q.size()){
int f=q.front();
q.pop();
for(int i=0;i<26;i++){
if(tr[f][i]){
nxt[tr[f][i]]=tr[nxt[f]][i];
q.push(tr[f][i]);
}else{
tr[f][i]=tr[nxt[f]][i];
}
}
}
}
void update(int p,int v){
for(int i=p;i<=dfc;i+=(i&(-i))){
sgt[i]+=v;
}
}
int query(int p){
int res=0;
for(int i=p;i;i-=(i&(-i))){
res+=sgt[i];
}
return res;
}
void dfs(int k){
dfn[k]=++dfc;
siz[k]=1;
for(int i=hs[k];~i;i=e[i].nxt){
dfs(e[i].to);
siz[k]+=siz[e[i].to];
}
}
void dfs2(int k){
update(dfn[k],1);
if(pos[k]){
for(int i=0;i<qs[pos[k]].size();i++){
int v=en[qs[pos[k]][i].u];
res[qs[pos[k]][i].id]=query(dfn[v]+siz[v]-1)-query(dfn[v]-1);
}
}
for(int i=0;i<26;i++){
if(trie[k][i]){
dfs2(trie[k][i]);
}
}
update(dfn[k],-1);
}
void query(){
for(int i=1;i<=cnt;i++){
add(nxt[i],i);
}
dfs(0);
dfs2(0);
}
char str[200010];
int len=0,n;
signed main(){
int cur=0;
memset(hs,-1,sizeof(hs));
while(true){
char c=getchar();
if(c=='B'){
len--;
}else if(c=='P'){
str[len]=0;
insert(str,++cur);
}else if(c=='\n'){
break;
}else{
str[len++]=c;
}
}
read(n);
int u,v;
for(int i=1;i<=n;i++){
read(u);
read(v);
qs[v].push_back(Query(u,i));
}
build();
query();
for(int i=1;i<=n;i++){
printf("%lld\n",res[i]);
}
return 0;
}