不开O2 AC 开了全RE /ll
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10, sig = 26;
string s;
int n;
struct Que {
int x, y, id;
bool operator< (const Que q) const {
return y < q.y;
}
}que[MAXN];
int son[MAXN][sig + 5], fa[MAXN], tot;
int pos[MAXN], t;
int dfn[MAXN], dn, sz[MAXN];
int tr[MAXN];
int ans[MAXN];
vector<int> edge[MAXN];
int st[MAXN], top;
void build1() {
int l = s.size();
int p = 0;
for (int i = 0; i < l; i++) {
if (s[i] >= 'a' && s[i] <= 'z') {
int c = s[i] - 'a';
if (!son[p][c]) son[p][c] = ++tot;
p = son[p][c];
st[++top] = p;
}
else if (s[i] == 'B') {
p = st[--top];
}
else {
pos[++t] = p;
}
}
}
void build2() {
queue<int> q;
for (int i = 0; i < sig; i++) {
if (son[0][i]) {
q.push(son[0][i]);
edge[0].push_back(son[0][i]);
}
}
while (!q.empty()) {
int p = q.front(); q.pop();
for (int i = 0; i < sig; i++) {
if (son[p][i]) {
fa[son[p][i]] = son[fa[p]][i];
q.push(son[p][i]);
edge[fa[son[p][i]]].push_back(son[p][i]);
}
else {
son[p][i] = son[fa[p]][i];
}
}
}
}
void dfs(int pos) {
dfn[pos] = ++dn; sz[pos] = 1;
for (int to : edge[pos]) {
dfs(to); sz[pos] += sz[to];
}
}
inline int add(int pos, int num) {
while (pos <= tot + 1) {
tr[pos] += num;
pos += pos & -pos;
}
}
inline int query(int pos) {
int res = 0;
while (pos) {
res += tr[pos];
pos -= pos & -pos;
}
return res;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> s;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> que[i].x >> que[i].y;
que[i].id = i;
}
sort(que + 1, que + n + 1);
build1(); build2();
dfs(0);
int p = 0, sp = 0, c = 0; top = 0;
for (int i = 1; i <= n; i++) {
for (; c < que[i].y; sp++) {
if (s[sp] >= 'a' && s[sp] <= 'z') {
int c = s[sp] - 'a';
p = son[p][c];
st[++top] = p;
add(dfn[p], 1);
}
else if (s[sp] == 'B') {
add(dfn[p], -1);
p = st[--top];
}
else {
c++;
}
}
int x = pos[que[i].x];
ans[que[i].id] = query(dfn[x] + sz[x] - 1) - query(dfn[x] - 1);
}
for (int i = 1; i <= n; i++) {
cout << ans[i] << endl;
}
return 0;
}