【无聊放个模板系列】BZOJ 3172 (AC自动机)

时间:2023-09-13 00:05:02
 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<stack>
using namespace std;
#define Maxn 210
#define Maxm 1000010 struct node
{
int son[],fail,cnt;
}t[Maxm];int tot; char s[Maxm];
int l,bj[Maxn]; void upd(int x)
{
memset(t[x].son,,sizeof(t[x].son));
t[x].fail=t[x].cnt=;
} void trie(int st)
{
int now=;
for(int i=;i<=l;i++)
{
int ind=s[i]-'a'+;
if(!t[now].son[ind])
{
t[now].son[ind]=++tot;upd(tot);
}
now=t[now].son[ind];
t[now].cnt++;
if(i==l) bj[st]=now;
}
} queue<int > q;
stack<int > sta;
void build()
{
while(!q.empty()) q.pop(); q.push();
while(!q.empty())
{
int x=q.front();sta.push(x);
q.pop();
for(int i=;i<=;i++) if(t[x].son[i])
{
if(x&&t[t[x].fail].son[i]) t[t[x].son[i]].fail=t[t[x].fail].son[i];
q.push(t[x].son[i]);
}
else t[x].son[i]=t[t[x].fail].son[i];
}
while(!sta.empty())
{
int x=sta.top();sta.pop();
t[t[x].fail].cnt+=t[x].cnt;
}
} int main()
{
int n;
scanf("%d",&n);
tot=;upd();
for(int i=;i<=n;i++)
{
scanf("%s",s+);
l=strlen(s+);
trie(i);
}
build();
for(int i=;i<=n;i++) printf("%d\n",t[bj[i]].cnt);
return ;
}

WA了几次之后终于给面子A了【捂脸= =打模板而已嘛- -

多年前手打队列版本

 #include<cstdio>
#include<cstdlib>
#include<cstring> const int Maxn=(int)1e4;
const int Maxl=; struct node
{
int son[],fail,cnt,ans;
}t[]; int n,m,cnt=;
int q[Maxn*Maxl+],bj[Maxn];
char s[Maxl]; void floy()
{
int i;
for(i=;i<=Maxn;i++) t[i].fail=,t[i].ans=;
} void read()
{
memset(bj,,sizeof(bj));
int i,j,x,ind;
scanf("%d",&n);
getchar();
for(i=;i<=n;i++)
{
scanf("%s",s+);
m=strlen(s+);
x=;
for(j=;j<=m;j++)
{
ind=s[j]-'a'+;
if(!t[x].son[ind]) t[x].son[ind]=++cnt;
x=t[x].son[ind];
t[x].cnt++;
if(j==m) bj[i]=cnt;
}
}
} void Build_AC()
{
int i,x,y,j;
q[]=;
q[++q[]]=;
//for(i=1;i<=26;i++) if(t[0].son[i]) q[++q[0]]=t[0].son[i];
for(i=;i<=q[];i++)
{
x=q[i];
y=t[x].fail;
for(j=;j<=;j++)
if(t[x].son[j])
{
//t[t[x].son[j]].fail=t[y].son[j];
t[t[x].son[j]].fail=x?t[y].son[j]:x;
q[++q[]]=t[x].son[j];
}
else t[x].son[j]=t[y].son[j];
}
for(i=q[];i>=;i--)
{
t[t[q[i]].fail].cnt+=t[q[i]].cnt;
}
//for(i=1;i<=cnt;i++) printf("%d %d %d %d\n",i,t[i].cnt,t[i].fail,t[i].ffail);
} int main()
{
read();
Build_AC();
for(int i=;i<=n;i++) printf("%d\n",t[bj[i]].cnt);
return ;
}

AC自动机

2016-11-18 10:18:14