求大佬答疑解惑
查看原帖
求大佬答疑解惑
1509960
hjluojc楼主2025/7/29 15:06

裸的AC自动机,没加优化,TLE 68pts ,题解也没看懂(我真的太蒟了

求大佬们的回答

#include <bits/stdc++.h>
using namespace std;

int cnt, n;
string s[200010], ss;
struct tree {
    int fail, vis[26];
    vector<int> ends; 
} ac[200010];
struct res {
    int num, pos;
} ans[200010];

void clean(int x) {
    memset(ac[x].vis, 0, sizeof(ac[x].vis));
    ac[x].fail = 0;
    ac[x].ends.clear();
}

void build(string s, int num) {
    int l = s.size(), now = 0;
    for (int i = 0; i < l; i++) {
        int c = s[i] - 'a';
        if (ac[now].vis[c] == 0) {
            cnt++;
            ac[now].vis[c] = cnt;
            clean(cnt);
        }
        now = ac[now].vis[c];
    }
    ac[now].ends.push_back(num); 
}

void bfs() {
    queue<int> q;
    for (int i = 0; i < 26; i++)
        if (ac[0].vis[i] != 0) {
            ac[ac[0].vis[i]].fail = 0;
            q.push(ac[0].vis[i]);
        }
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int i = 0; i < 26; i++) {
            int v = ac[u].vis[i];
            if (v != 0) {
                ac[v].fail = ac[ac[u].fail].vis[i];
                q.push(v);
            } else {
                ac[u].vis[i] = ac[ac[u].fail].vis[i];
            }
        }
    }
}

void query(string s) {
    int l = s.size();
    int now = 0;
    for (int i = 0; i < l; i++) {
        now = ac[now].vis[s[i] - 'a'];
        for (int t = now; t; t = ac[t].fail) {
            for (int id : ac[t].ends) { 
                ans[id].num++;
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin >> n;
    cnt = 0;
    clean(0);
    for (int i = 1; i <= n; i++) {
        cin >> s[i];
        ans[i].num = 0;
        ans[i].pos = i;
        build(s[i], i);
    }
    ac[0].fail = 0;
    bfs();
    cin >> ss;
    query(ss);
    
    for (int i = 1; i <= n; i++) {
        cout << ans[i].num << "\n";
    }
    
    return 0;
}

谢谢啦~

2025/7/29 15:06
加载中...