1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 #include<queue>
7 using namespace std;
8 #define Maxn 100100
9 #define Maxl 100010
10
11 char s[Maxl];
12 int p[Maxn];
13
14 struct hp
15 {
16 int x,y,next,id,ans;
17 }qy[Maxn];int al;
18
19 struct node
20 {
21 int son[30],cnt,fail;
22 int num,rt,fa,st;
23 }t[Maxn];int tot;
24
25 int first[Maxn],c[Maxn];
26
27 bool cmp(hp x,hp y) {return p[x.y]<p[y.y];}
28 bool cmp2(hp x,hp y) {return x.id<y.id;}
29
30 void ins(int x,int y)
31 {
32 qy[++al].x=x;qy[al].y=y;
33 qy[al].next=first[x];first[x]=al;
34 }
35
36 void upd(int x,int f)
37 {
38 t[x].cnt=0;t[x].fa=f;t[x].st=0;
39 memset(t[x].son,0,sizeof(t[x].son));
40 }
41
42 void read_trie()
43 {
44 scanf("%s",s+1);
45 int len=strlen(s+1);
46 memset(p,0,sizeof(p));
47 int now=0;int ql=0;tot=0;
48 for(int j=1;j<=len;j++)
49 {
50 if(s[j]>=‘a‘&&s[j]<=‘z‘)
51 {
52 int ind=s[j]-‘a‘+1;
53 if(!t[now].son[ind])
54 t[now].son[ind]=++tot,upd(tot,now);
55 now=t[now].son[ind];
56 if(j==len) t[now].cnt++;
57 }
58 else if(s[j]==‘B‘) now=t[now].fa;
59 else p[++ql]=now;
60 }
61 }
62
63 queue<int > q;
64 void build_AC()
65 {
66 int i,j,x,y;
67 while(!q.empty()) q.pop();
68 q.push(0);
69 while(!q.empty())
70 {
71 x=q.front();
72 y=t[x].fail;
73 for(j=1;j<=26;j++)
74 {
75 if(t[x].son[j])
76 {
77 q.push(t[x].son[j]);
78 t[t[x].son[j]].fail=x?t[y].son[j]:x;
79 ins(t[t[x].son[j]].fail,t[x].son[j]);
80 }
81 else t[x].son[j]=t[y].son[j];
82 }
83 q.pop();
84 }
85 }
86
87 void dfs(int x)
88 {
89 t[x].num=++al;t[x].rt=t[x].num;
90 for(int i=first[x];i;i=qy[i].next)
91 dfs(qy[i].y),t[x].rt=t[qy[i].y].rt;
92 }
93
94 void add(int x,int y)
95 {
96 for(int i=x;i<=tot+1;i+=i&(-i))
97 c[i]+=y;
98 }
99
100 int getsum(int x)
101 {
102 int ans=0;
103 for(int i=x;i>=1;i-=i&(-i))
104 ans+=c[i];
105 return ans;
106 }
107
108 void dfs2(int x)
109 {
110 add(t[x].num,1);
111 if(t[x].st!=0)
112 {
113 for(int i=t[x].st;;i++)
114 {
115 if(p[qy[i].y]!=x) break;
116 qy[i].ans=getsum(t[p[qy[i].x]].rt)-getsum(t[p[qy[i].x]].num-1);
117 }
118 }
119 for(int i=1;i<=26;i++) if(t[x].son[i]&&t[t[x].son[i]].fa==x)
120 {
121 dfs2(t[x].son[i]);
122 }
123 add(t[x].num,-1);
124 }
125
126 void init()
127 {
128 memset(first,0,sizeof(first));
129 al=0;
130 read_trie();
131 build_AC();al=0;
132 dfs(0);
133 int m;
134 scanf("%d",&m);
135 for(int i=1;i<=m;i++) {scanf("%d%d",&qy[i].x,&qy[i].y);qy[i].id=i;}
136 sort(qy+1,qy+1+m,cmp);
137 qy[0].y=0;
138 for(int i=1;i<=m;i++)
139 if(p[qy[i].y]!=p[qy[i-1].y]) t[p[qy[i].y]].st=i;
140 else t[p[qy[i].y]].st=t[p[qy[i-1].y]].st;
141 memset(c,0,sizeof(c));
142 dfs2(0);
143 sort(qy+1,qy+1+m,cmp2);
144 for(int i=1;i<=m;i++) printf("%d\n",qy[i].ans);
145 }
146
147 int main()
148 {
149 init();
150 return 0;
151 }