AC自动机 求助
查看原帖
AC自动机 求助
340333
dengyunsheng楼主2021/3/1 20:05

此处为代码

#include<bits/stdc++.h>
using namespace std;
int n;
const int N = 1e6 + 10;
int tr[N][26],idx;
queue<int>q;
int fail[N];
int tag[N];
string s[N];
string str;
int ans[N];
void build(int x){
    int p = 0;
    for(int i=0;i < s[x].size();i++){
        int t = s[x][i] - 'a';
        if(!tr[p][t]) tr[p][t] = ++idx;
        p = tr[p][t];
    }
    tag[p] = x;
}
void get_fail(){
    for(int i=0;i<26;i++) if(tr[0][i]) q.push(tr[0][i]);
    while(q.size()){
        int t = q.front();
        q.pop();
        for(int i=0;i<26;i++){
            if(tr[t][i]){
                fail[tr[t][i]] = tr[fail[t]][i];
                q.push(tr[t][i]);
            }else tr[t][i] = tr[fail[t]][i];
        }
    }
}
void AC(){
    int p = 0;
    for(int i=0;i<str.size();i++){
        if(str[i] != '{') p = tr[p][str[i] - 'a'];
        else{
            p = 0;
            continue;
        }
        for(int j=p;j;j = fail[j]){
            ans[tag[j]]++;
        }
    }
}
int main(){
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> s[i];
        str += s[i] + '{';
        build(i);
    }
    cout << str << endl;
    get_fail();
    AC();
    for(int i=1;i<=n;i++) cout << ans[i] << endl;
    return 0;
}
2021/3/1 20:05
加载中...