mxqz AC 自动机

P3796 AC 自动机(简单版 II)

```cpp #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; int n; string tmp[1000005]; char str[1000005]; int cnt,son[1000005][26],who[1000005]; int fail[1000005]; int tot[155]; inline void ins(int x) { int u=1; int len=strlen(str+1); for(int i=1;i<=n;i++) { int id=str[i]-'a'; if(son[u][id]==0) { son[u][id]=++cnt; } u=son[u][id]; } who[u]=x; } inline void init() { for(int i=0;i<26;i++) { son[0][i]=1; } queue<int> q; q.push(1); fail[1]=0; while(!q.empty()) { int u=q.front(); q.pop(); int fiu=fail[u]; for(int i=0;i<26;i++) { int v=son[u][i]; if(v!=0) { fail[v]=son[fiu][i]; q.push(v); } else { son[u][i]=son[fiu][i]; } } } } inline void slove() { int u=1; int len=strlen(str+1); for(int i=1;i<=len;i++) { int id=str[i]-'a'; int v=son[u][id]; while(v!=1) { if(who[v]!=0) { tot[who[v]]++; } v=fail[v]; } u=son[u][id]; } } int main() { while(1) { scanf("%d",&n); if(n==0) { break; } cnt=1; memset(son,0,sizeof(son)); memset(who,0,sizeof(who)); memset(tot,0,sizeof(tot)); for(int i=1;i<=n;i++) { scanf("%s",str+1); tmp[i]=str+1; ins(i); } init(); scanf("%s",str+1); slove(); int maxtime=0; for(int i=1;i<=n;i++) { maxtime=max(maxtime,tot[i]); } printf("%d\n",maxtime); for(int i=1;i<=n;i++) { if(tot[i]==maxtime) { printf("%s\n",tmp[i].c_str()); } } } return 0; } ```
by lovely_ckj @ 2021-11-17 12:37:17


BFS出问题了,私信我
by htssm @ 2021-11-17 13:34:32


@[lovely_ckj](/user/251130) 您这个BFS的时候要这样入队 ```cpp for(i=0;i<26;++i){ if(son[0][i]!=0){ fail[son[0][i]]=0; q.push(son[0][i]); } } ```
by htssm @ 2021-11-17 13:35:52


我AC自动机的模板也调了很久。。。
by htssm @ 2021-11-17 13:36:39


@[htssm](/user/498526) 谢谢,刚刚回宿舍午休了/kk
by lovely_ckj @ 2021-11-17 14:07:18



by htssm @ 2021-11-17 14:36:01


|