[P5357] 【模板】AC自动机(二次加强版)
[P5357] 【模板】AC自动机(二次加强版)

#include <bits/stdc++.h>
using namespace std;
struct ACA {
    queue <int> q;
    int c[500005][26],val[500005],pos[500005],fi[500005],cnt,ans[500005];
    vector <int> g[500005];
    void init() {
        memset(c,0,sizeof c);
        memset(val,0,sizeof val);
        memset(fi,0,sizeof fi);
        memset(ans,0,sizeof ans);
        cnt=0;
    }
    void ins(char *str,int id) {
        int len=strlen(str), p=0;
        for(int i=0; i<len; i++) {
            int v=str[i]-'a';
            if(!c[p][v]) c[p][v]=++cnt;
            p=c[p][v];
        }
        val[p]=id;
        pos[id]=p;
    }
    void build() {
        for(int i=0; i<26; i++) if(c[0][i]) fi[c[0][i]]=0, q.push(c[0][i]);
        while(!q.empty()) {
            int u=q.front();
            q.pop();
            for(int i=0; i<26; i++)
                if(c[u][i]) fi[c[u][i]]=c[fi[u]][i], q.push(c[u][i]);
                else c[u][i]=c[fi[u]][i];
        }
    }
    int query(char *s) {
        int len=strlen(s);
        int p=0;
        for(int i=0; i<len; i++) {
            p=c[p][s[i]-'a'];
            /*for(int t=p; t&&~val[t]; t=fi[t])
                ans[val[t]]++;*/
            ans[p]++;
        }
    }
    void dfs(int p) {
        for(int i=0;i<g[p].size();i++) {
            dfs(g[p][i]);
            ans[p]+=ans[g[p][i]];
        }
    }
    void post() {
        for(int i=0;i<=cnt;i++) if(fi[i]!=i) g[fi[i]].push_back(i);
        dfs(0);
    }
} AC;
int n;
char p[2000005];
int main() {
    scanf("%d",&n);
    memset(p,0,sizeof p);
    AC.init();
    for(int i=1; i<=n; i++) scanf("%s",p), AC.ins(p,i);
    AC.build();
    scanf("%s",p);
    AC.query(p);
    AC.post();
    for(int i=1; i<=n; i++) printf("%d\n",AC.ans[AC.pos[i]]);
}

相关文章:

  • 2021-05-20
  • 2021-06-08
  • 2021-06-11
  • 2021-09-05
猜你喜欢
  • 2021-09-28
  • 2022-12-23
  • 2021-05-20
  • 2022-01-10
  • 2022-01-18
  • 2021-11-30
相关资源
相似解决方案