玄关求调
查看原帖
玄关求调
1246655
wxhnlex楼主2025/7/28 17:46

评测记录

#include<bits/stdc++.h>
#define Code using
#define By namespace 
#define ZYY std;
Code By ZYY;
const int N = 2e6 + 10;
char s[N], t[N];
int n, tot = 0, din[N];
int mp[N], root = 0;
int ans[N];
struct Ac{
    int fail, ed, nxt[27];
    int flag = 0;
}tr[N];

inline void insert(char *s, int p) {
    int len = strlen(s + 1), now = root;
    for (int i = 1; i <= len; i++) {
        int u = s[i] - 'a';
        if (!tr[now].nxt[u]) tr[now].nxt[u] = ++tot;
        now = tr[now].nxt[u];
    }
    tr[now].ed = p;
    mp[p] = now; 
}

inline void Get_Fail() {
    queue<int> q;
    for (int i = 0; i < 26; i++) {
        int u = tr[root].nxt[i];
        if (!u) {tr[root].nxt[i] = root; continue;}
        tr[u].fail = root; 
        q.push(u);
        din[root]++;
    }

    while (q.size()) {
        int u = q.front(); q.pop();
        for (int i = 0; i < 26; i++) {
            int v = tr[u].nxt[i];
            if (!v) {
                tr[u].nxt[i] = tr[tr[u].fail].nxt[i];
                continue;
            }
            tr[v].fail = tr[tr[u].fail].nxt[i];
            din[tr[v].fail]++;
            q.push(v);
        }
    }
}

inline void query(char *t) {
    int len = strlen(t + 1), now = root;
    for (int i = 1; i <= len; i++) {
        int u = t[i] - 'a';
        now = tr[now].nxt[u];
        tr[now].flag++;
    }
}

inline void topsort() {
    queue<int> q;
    for (int i = 1; i <= tot; i++) {
        if (!din[i]) q.push(i);
    }
    while (q.size()) {
        int u = q.front(); q.pop();
        if (tr[u].ed) ans[tr[u].ed] = tr[u].flag;
        int k = tr[u].fail;
        tr[k].flag += tr[u].flag;
        if (!--din[k]) q.push(k);
    }
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> (s + 1);
        insert(s, i);
    }
    cin >> (t + 1);
    Get_Fail();
    query(t);
    topsort();
    for (int i = 1; i <= n; i++) {
        cout << ans[i] << endl;
    }
    return 0;
}
2025/7/28 17:46
加载中...