性感厌氧代码在线求调
查看原帖
性感厌氧代码在线求调
326172
Wuming_Shi楼主2025/1/14 21:31

不开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;
}
2025/1/14 21:31
加载中...